/// <summary> /// Begins a async operation to get location info of the specified IP address. /// </summary> /// <param name="ip"></param> /// <param name="proxy"></param> /// <param name="callback"></param> /// <param name="userState"></param> /// <returns></returns> /// <exception cref="System.ArgumentException"><paramref name="ip"/> not represents a valid IP address.</exception> public static IAsyncResult BeginGetLocation(string ip, IWebProxy proxy, AsyncCallback callback, object userState) { HttpWebRequest request = CreateGetLocationRequest(ip, proxy); AsyncResult <IEnumerable <string> > result = new AsyncResult <IEnumerable <string> >(callback, userState); NetworkRequestAsyncTimeout.RegisterRequest(request.BeginGetResponse((ar) => { IEnumerable <string> locations = null; try { locations = ParseGetLocationResponse(request, (HttpWebResponse)((HttpWebRequest)ar.AsyncState).EndGetResponse(ar)); } catch (Exception ex) { result.MarkCompleted(ex, false); return; } result.MarkCompleted(null, locations); }, request), request, TIMEOUT); return(result); }
/// <summary> /// Begins a async operation to post data to a HTTP resource. /// </summary> /// <param name="request">A HttpWebRequest object.</param> /// <param name="serializer">A FormValuesSerializer object to serialize data to HTTP request stream.</param> /// <param name="data">The data to post.</param> /// <param name="name">If data is not complex type, use to name it.</param> /// <param name="callback">The callback mehtod to invoke when async operation has completed.</param> /// <param name="userState">A user specified data.</param> /// <returns></returns> /// <remarks>If you want to upload a file, <paramref name="data"/> must has a member of HttpPostingFile type.</remarks> public static IAsyncResult BeginPostRequest(HttpWebRequest request, FormValuesSerializer serializer, object data, string name, AsyncCallback callback, object userState) { if (request == null) { throw new ArgumentNullException("request"); } string boundary = null; serializer = serializer ?? new FormValuesSerializer(); bool needEncode = FormValuesSerializer.CheckEncodeRequirement(data); AsyncResult <HttpWebResponse> result = new AsyncResult <HttpWebResponse>(callback, userState); request.Method = WebRequestMethods.Http.Post; if (needEncode) { request.ContentType = "application/x-www-form-urlencoded"; } else { request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary = GetRandomBoundary()); } if (data != null) { NetworkRequestAsyncTimeout.RegisterRequest(request.BeginGetRequestStream((streamResult) => { HttpWebRequest httpRequest = (HttpWebRequest)streamResult.AsyncState; try { using (Stream writer = httpRequest.EndGetRequestStream(streamResult)) { if (needEncode) { serializer.Serialize(data, name, writer); } else { serializer.Serialize(data, name, boundary, writer); } } NetworkRequestAsyncTimeout.RegisterRequest(httpRequest.BeginGetResponse((responseResult) => { Exception exception = null; HttpWebResponse response = null; try { response = (HttpWebResponse)((HttpWebRequest)responseResult.AsyncState).EndGetResponse(responseResult); } catch (Exception ex) { exception = ex; } result.MarkCompleted(exception, response); }, httpRequest), httpRequest, httpRequest.Timeout); } catch (WebException ex) { result.MarkCompleted(ex, (HttpWebResponse)ex.Response); } catch (Exception ex) { result.MarkCompleted(ex); } }, request), request, request.Timeout); } else { //avoid sending 411 server error request.ContentLength = 0; NetworkRequestAsyncTimeout.RegisterRequest(request.BeginGetResponse((responseResult) => { Exception exception = null; HttpWebResponse response = null; try { response = (HttpWebResponse)((HttpWebRequest)responseResult.AsyncState).EndGetResponse(responseResult); } catch (Exception ex) { exception = ex; } result.MarkCompleted(exception, response); }, request), request, request.Timeout); } return(result); }