Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }