private static void ReadCallBack(IAsyncResult asyncResult) { JsonWebRequest.RequestState asyncState = (JsonWebRequest.RequestState)asyncResult.AsyncState; try { Stream streamResponse = asyncState.streamResponse; int count = streamResponse.EndRead(asyncResult); if (count > 0) { asyncState.readBytes.AddRange(((IEnumerable <byte>)asyncState.BufferRead).Take <byte>(count)); streamResponse.BeginRead(asyncState.BufferRead, 0, 5000, new AsyncCallback(JsonWebRequest.ReadCallBack), asyncState); } else { string stringContent = Encoding.UTF8.GetString(asyncState.readBytes.ToArray(), 0, asyncState.readBytes.Count); JsonWebRequest.SafeClose(asyncState); Logger.Instance.Info("<<<<<<<<<<<<JSONWebRequest duration {0} ms. URI {1} ---->>>>> {2}", (DateTime.Now - asyncState.startTime).TotalMilliseconds, ((WebRequest)asyncState.request).RequestUri.OriginalString, stringContent); JsonWebRequest.SafeInvokeCallback(asyncState.resultCallback, true, stringContent); } } catch (Exception ex) { Logger.Instance.Error("ReadCallBack failed.", ex); JsonWebRequest.SafeClose(asyncState); JsonWebRequest.SafeInvokeCallback(asyncState.resultCallback, false, null); } }
public static void SendHTTPRequestAsync(string baseUri, Dictionary <string, string> parameters, Action <JsonResponseData> resultCallback, bool usePost = true, bool lowPriority = false, bool pageDataRequest = true) { if (lowPriority) { Action <Action> action = (Action <Action>)(a => JsonWebRequest.SendHTTPRequestAsync(baseUri, parameters, (Action <JsonResponseData>)(res => { a(); resultCallback(res); }), usePost, false, true)); JsonWebRequest._lowPriorityQueue.AddToDelayedExecutionQueue(action, baseUri); } else { Logger.Instance.Info(">>>>>>>>>>>>>>>Starting GETAsync concurrentRequestsNo = {0} ; baseUri = {1}; parameters = {2}", JsonWebRequest._currentNumberOfRequests, baseUri, JsonWebRequest.GetAsLogString(parameters)); Interlocked.Increment(ref JsonWebRequest._currentNumberOfRequests); string queryString = JsonWebRequest.ConvertDictionaryToQueryString(parameters, true); JsonWebRequest.RequestState myRequestState = new JsonWebRequest.RequestState(); try { myRequestState.resultCallback = resultCallback; string requestUriString = baseUri; if (!usePost && queryString.Length > 0) { requestUriString = requestUriString + "?" + queryString; } HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(requestUriString); myHttpWebRequest.UserAgent = AppInfo.AppVersionForUserAgent; myRequestState.request = myHttpWebRequest; if (usePost) { myHttpWebRequest.ContentType = "application/x-www-form-urlencoded"; myHttpWebRequest.Method = "POST"; myHttpWebRequest.BeginGetRequestStream((AsyncCallback)(ar => { using (StreamWriter streamWriter = new StreamWriter(myHttpWebRequest.EndGetRequestStream(ar))) streamWriter.Write(queryString); myHttpWebRequest.BeginGetCompressedResponse(new AsyncCallback(JsonWebRequest.RespCallback), myRequestState); }), null); } else { myHttpWebRequest.BeginGetCompressedResponse(new AsyncCallback(JsonWebRequest.RespCallback), myRequestState); } } catch (Exception ex) { Logger.Instance.Error("GetJsonAsync failed.", ex); JsonWebRequest.SafeClose(myRequestState); JsonWebRequest.SafeInvokeCallback(myRequestState.resultCallback, false, null); } } }
public static void Upload(string uri, Stream data, string paramName, string uploadContentType, Action <JsonResponseData> resultCallback, string fileName = null, Action <double> progressCallback = null, Cancellation c = null) { JsonWebRequest.RequestState rState = new JsonWebRequest.RequestState() { resultCallback = resultCallback }; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.AllowWriteStreamBuffering = false; request.UserAgent = AppInfo.AppVersionForUserAgent; rState.request = request; request.Method = "POST"; string str1 = string.Format("----------{0:N}", Guid.NewGuid()); string str2 = "multipart/form-data; boundary=" + str1; request.ContentType = str2; request.CookieContainer = new CookieContainer(); string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: {3}\r\n\r\n", str1, paramName, (fileName ?? "myDataFile"), uploadContentType); string footer = string.Format("\r\n--{0}--\r\n", str1); request.ContentLength = ((long)Encoding.UTF8.GetByteCount(header) + data.Length + (long)Encoding.UTF8.GetByteCount(footer)); request.BeginGetRequestStream((AsyncCallback)(ar => { try { Stream requestStream = request.EndGetRequestStream(ar); requestStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetByteCount(header)); StreamUtils.CopyStream(data, requestStream, progressCallback, c, 0L); requestStream.Write(Encoding.UTF8.GetBytes(footer), 0, Encoding.UTF8.GetByteCount(footer)); requestStream.Close(); request.BeginGetResponse(new AsyncCallback(JsonWebRequest.RespCallback), rState); } catch (Exception ex) { Logger.Instance.Error("Upload failed to write data to request stream.", ex); JsonWebRequest.SafeClose(rState); JsonWebRequest.SafeInvokeCallback(rState.resultCallback, false, null); } }), null); } catch (Exception ex) { Logger.Instance.Error("Upload failed.", ex); JsonWebRequest.SafeClose(rState); JsonWebRequest.SafeInvokeCallback(rState.resultCallback, false, null); } }
private static void RespCallback(IAsyncResult asynchronousResult) { JsonWebRequest.RequestState asyncState = (JsonWebRequest.RequestState)asynchronousResult.AsyncState; try { HttpWebRequest request = asyncState.request; asyncState.response = (HttpWebResponse)request.EndGetResponse(asynchronousResult); Stream compressedResponseStream = asyncState.response.GetCompressedResponseStream(); asyncState.streamResponse = compressedResponseStream; compressedResponseStream.BeginRead(asyncState.BufferRead, 0, 5000, new AsyncCallback(JsonWebRequest.ReadCallBack), asyncState); } catch (WebException ex1) { Logger.Instance.Error(string.Format("RespCallback failed. Got httpWebResponse = {0} , uri = {1}", (ex1.Response is HttpWebResponse), ((WebRequest)asyncState.request).RequestUri), (Exception)ex1); if (ex1.Response is HttpWebResponse && ex1.Response.ContentLength > 0L) { WebResponse response = ex1.Response; asyncState.response = ex1.Response as HttpWebResponse; try { Stream compressedResponseStream = asyncState.response.GetCompressedResponseStream(); asyncState.streamResponse = compressedResponseStream; compressedResponseStream.BeginRead(asyncState.BufferRead, 0, 5000, new AsyncCallback(JsonWebRequest.ReadCallBack), asyncState); } catch (Exception ex2) { Logger.Instance.Error(string.Format("RespCallback failed. Uri ={0}", ((WebRequest)asyncState.request).RequestUri), ex2); JsonWebRequest.SafeClose(asyncState); JsonWebRequest.SafeInvokeCallback(asyncState.resultCallback, false, null); } } else { JsonWebRequest.SafeClose(asyncState); JsonWebRequest.SafeInvokeCallback(asyncState.resultCallback, false, null); } } catch (Exception ex) { Logger.Instance.Error(string.Format("RespCallback failed. Uri ={0}", ((WebRequest)asyncState.request).RequestUri), ex); JsonWebRequest.SafeClose(asyncState); JsonWebRequest.SafeInvokeCallback(asyncState.resultCallback, false, null); } }
private static void SafeClose(JsonWebRequest.RequestState state) { try { if (state.streamResponse != null) { state.streamResponse.Close(); } if (state.response == null) { return; } state.response.Close(); } catch (Exception ex) { Logger.Instance.Error("SafeClose failed.", ex); } }
public static void SendHTTPRequestAsync(string uri, Action <JsonResponseData> resultCallback, Dictionary <string, object> postData = null) { Logger.Instance.Info("Starting GetJsonAsync for uri = {0}", uri); Interlocked.Increment(ref JsonWebRequest._currentNumberOfRequests); JsonWebRequest.RequestState myRequestState = new JsonWebRequest.RequestState(); try { myRequestState.resultCallback = resultCallback; HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(uri); myHttpWebRequest.UserAgent = AppInfo.AppVersionForUserAgent; myRequestState.request = myHttpWebRequest; if (postData != null) { string boundary = string.Format("----------{0:N}", Guid.NewGuid()); string str = "multipart/form-data; boundary=" + boundary; byte[] formData = JsonWebRequest.GetMultipartFormData(postData, boundary); myHttpWebRequest.Method = "POST"; myHttpWebRequest.ContentType = str; myHttpWebRequest.CookieContainer = new CookieContainer(); myHttpWebRequest.BeginGetRequestStream((AsyncCallback)(ar => { Stream requestStream = myHttpWebRequest.EndGetRequestStream(ar); byte[] buffer = formData; int offset = 0; int length = formData.Length; requestStream.Write(buffer, offset, length); requestStream.Close(); myHttpWebRequest.BeginGetResponse(new AsyncCallback(JsonWebRequest.RespCallback), myRequestState); }), null); } else { myHttpWebRequest.BeginGetResponse(new AsyncCallback(JsonWebRequest.RespCallback), myRequestState); } } catch (Exception ex) { Logger.Instance.Error("GetJsonAsync failed.", ex); JsonWebRequest.SafeClose(myRequestState); JsonWebRequest.SafeInvokeCallback(myRequestState.resultCallback, false, null); } }