private void SendMessage(ApiRequest requestInfo) { try { _log.DebugFormat("begin send request {0}", requestInfo); CoreContext.TenantManager.SetCurrentTenant(requestInfo.Tenant); var authKey = SecurityContext.AuthenticateMe(requestInfo.User.ID); if (string.IsNullOrEmpty(authKey)) { _log.ErrorFormat("can't obtain authorization cookie for user {0}", requestInfo.User.ID); return; } var uri = BuildUri(requestInfo); _log.Debug(uri); _log.DebugFormat("builded uri for request {0}", uri); var request = (HttpWebRequest)WebRequest.Create(uri); request.Method = requestInfo.Method; request.AllowAutoRedirect = true; request.Headers["Authorization"] = authKey; using (var requestStream = request.GetRequestStream()) { if (requestInfo.FilesToPost != null && requestInfo.FilesToPost.Any()) { WriteMultipartRequest(request, requestStream, requestInfo); } else { WriteFormEncoded(request, requestStream, requestInfo, authKey); } } try { using (var response = request.GetResponse()) using (var responseStream = response.GetResponseStream()) { if (responseStream != null) { _log.DebugFormat("response from server: {0}", new StreamReader(responseStream).ReadToEnd()); } } } catch (Exception error) { _log.Error("error while getting the response", error); } _log.DebugFormat("end send request {0}", requestInfo); } catch (Exception x) { _log.Error("error while sending request", x); throw; } }
private void WriteFormEncoded(WebRequest request, Stream requestStream, ApiRequest requestInfo, string authKey) { var stringBuilder = new StringBuilder(); if (requestInfo.Parameters != null && requestInfo.Parameters.Any()) { foreach (var parameter in requestInfo.Parameters.Where(x => x.Value != null)) { if (parameter.Value is IEnumerable<object>) { foreach (var value in ((IEnumerable<object>)parameter.Value)) { stringBuilder.AppendFormat("{0}[]={1}&", HttpUtility.UrlEncode(parameter.Name), HttpUtility.UrlEncode(value.ToString())); } } else if (parameter.Value is DateTime) { stringBuilder.AppendFormat("{0}={1}&", HttpUtility.UrlEncode(parameter.Name), HttpUtility.UrlEncode(((DateTime)parameter.Value).ToString("s"))); } else { stringBuilder.AppendFormat("{0}={1}&", HttpUtility.UrlEncode(parameter.Name), HttpUtility.UrlEncode(parameter.Value.ToString())); } } } stringBuilder.AppendFormat("asc_auth_key={0}", authKey); _log.DebugFormat("writing form data {0}", stringBuilder); WriteUtf8String(requestStream, stringBuilder.ToString()); request.ContentType = "application/x-www-form-urlencoded"; }
public void EnqueueRequest(ApiRequest request) { _log.DebugFormat("queue request \"{0}\"", request); _messageQueue.Add(request); }
private void WriteMultipartRequest(WebRequest request, Stream requestStream, ApiRequest requestInfo) { var boundaryId = DateTime.Now.Ticks.ToString("x"); var boundary = "\r\n--" + boundaryId + "\r\n"; var formdataTemplate = "\r\n--" + boundaryId + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}"; if (requestInfo.Parameters != null && requestInfo.Parameters.Any()) { foreach (var parameter in requestInfo.Parameters.Where(x => x.Value != null)) { var formItem = string.Empty; if (parameter.Value is IEnumerable<object>) { foreach (var value in ((IEnumerable<object>)parameter.Value)) { formItem = string.Format(formdataTemplate, parameter.Name, value); } } else if (parameter.Value is DateTime) { formItem = string.Format(formdataTemplate, parameter.Name, ((DateTime)parameter.Value).ToString("s")); } else { formItem = string.Format(formdataTemplate, parameter.Name, parameter.Value); } if (!string.IsNullOrEmpty(formItem)) { _log.DebugFormat("writing form item boundary:{0}", formItem); WriteUtf8String(requestStream, formItem); } } } WriteUtf8String(requestStream, boundary); var files = requestInfo.FilesToPost.ToArray(); for (int i = 0; i < files.Length; i++) { WriteFile(requestStream, files[i]); if (i < files.Length - 1) WriteUtf8String(requestStream, boundary); else WriteUtf8String(requestStream, "\r\n--" + boundaryId + "--\r\n"); } request.ContentType = new ContentType("multipart/form-data") { Boundary = boundaryId }.ToString(); }
private Uri BuildUri(ApiRequest requestInfo) { return new Uri(string.Format(_adressTemplate, requestInfo.Tenant.TenantAlias, requestInfo.Url.TrimStart('/'))); }
private Uri BuildUri(ApiRequest requestInfo) { return(new Uri(string.Format(_adressTemplate, requestInfo.Tenant.TenantAlias, requestInfo.Url.TrimStart('/')))); }