Exemplo n.º 1
0
        /// <summary>
        /// Sends the asynchronous.
        /// </summary>
        /// <typeparam name="TRequest">The type of the request.</typeparam>
        /// <typeparam name="TResponse">The type of the response.</typeparam>
        /// <param name="method">The method.</param>
        /// <param name="requestBody">The request body.</param>
        /// <param name="request">The request.</param>
        /// <param name="setHeadersCallback">The set headers callback.</param>
        /// <returns>The response object.</returns>
        /// <exception cref="System.ArgumentNullException">request</exception>
        private async Task <TResponse> SendAsync <TRequest, TResponse>(string method, TRequest requestBody, WebRequest request, Action <WebRequest> setHeadersCallback = null)
        {
            try
            {
                if (request == null)
                {
                    throw new ArgumentNullException("request");
                }

                request.Method = method;
                if (null == setHeadersCallback)
                {
                    this.SetCommonHeaders(request);
                }
                else
                {
                    setHeadersCallback(request);
                }

                if (requestBody is Stream)
                {
                    request.ContentType = "application/octet-stream";
                }

                var asyncState = new WebRequestAsyncState()
                {
                    RequestBytes = this.SerializeRequestBody(requestBody),
                    WebRequest   = (HttpWebRequest)request,
                };

                var continueRequestAsyncState = await Task.Factory.FromAsync <Stream>(
                    asyncState.WebRequest.BeginGetRequestStream,
                    asyncState.WebRequest.EndGetRequestStream,
                    asyncState,
                    TaskCreationOptions.None).ContinueWith <WebRequestAsyncState>(
                    task =>
                {
                    var requestAsyncState = (WebRequestAsyncState)task.AsyncState;
                    if (requestBody != null)
                    {
                        using (var requestStream = task.Result)
                        {
                            if (requestBody is Stream)
                            {
                                (requestBody as Stream).CopyTo(requestStream);
                            }
                            else
                            {
                                requestStream.Write(requestAsyncState.RequestBytes, 0, requestAsyncState.RequestBytes.Length);
                            }
                        }
                    }

                    return(requestAsyncState);
                });

                var continueWebRequest = continueRequestAsyncState.WebRequest;
                var response           = await Task.Factory.FromAsync <WebResponse>(
                    continueWebRequest.BeginGetResponse,
                    continueWebRequest.EndGetResponse,
                    continueRequestAsyncState);

                return(this.ProcessAsyncResponse <TResponse>(response as HttpWebResponse));
            }
            catch (Exception e)
            {
                this.HandleException(e);
                return(default(TResponse));
            }
        }
        /// <summary>
        /// Sends the asynchronous.
        /// </summary>
        /// <typeparam name="TRequest">The type of the request.</typeparam>
        /// <typeparam name="TResponse">The type of the response.</typeparam>
        /// <param name="method">The method.</param>
        /// <param name="requestBody">The request body.</param>
        /// <param name="request">The request.</param>
        /// <param name="setHeadersCallback">The set headers callback.</param>
        /// <returns>The response object.</returns>
        /// <exception cref="System.ArgumentNullException">request</exception>
        private async Task <TResponse> SendAsync <TRequest, TResponse>(string method, TRequest requestBody, WebRequest request, Action <WebRequest> setHeadersCallback = null)
        {
            try
            {
                if (request == null)
                {
                    throw new ArgumentNullException("request");
                }

                request.Method = method;
                if (null == setHeadersCallback)
                {
                    this.SetCommonHeaders(request);
                }
                else
                {
                    setHeadersCallback(request);
                }

                if (requestBody is Stream)
                {
                    request.ContentType = "application/octet-stream";
                }

                var asyncState = new WebRequestAsyncState()
                {
                    RequestBytes = this.SerializeRequestBody(requestBody),
                    WebRequest   = (HttpWebRequest)request,
                };

                var continueRequestAsyncState = await Task.Factory.FromAsync <Stream>(
                    asyncState.WebRequest.BeginGetRequestStream,
                    asyncState.WebRequest.EndGetRequestStream,
                    asyncState,
                    TaskCreationOptions.None).ContinueWith <WebRequestAsyncState>(
                    task =>
                {
                    var requestAsyncState = (WebRequestAsyncState)task.AsyncState;
                    if (requestBody != null)
                    {
                        using (var requestStream = task.Result)
                        {
                            if (requestBody is Stream)
                            {
                                (requestBody as Stream).CopyTo(requestStream);
                            }
                            else
                            {
                                requestStream.Write(requestAsyncState.RequestBytes, 0, requestAsyncState.RequestBytes.Length);
                            }
                        }
                    }

                    return(requestAsyncState);
                }).ConfigureAwait(false);

                var continueWebRequest = continueRequestAsyncState.WebRequest;
                var getResponseAsync   = Task.Factory.FromAsync <WebResponse>(
                    continueWebRequest.BeginGetResponse,
                    continueWebRequest.EndGetResponse,
                    continueRequestAsyncState);

                await Task.WhenAny(getResponseAsync, Task.Delay(DefaultTimeout)).ConfigureAwait(false);

                //Abort request if timeout has expired
                if (!getResponseAsync.IsCompleted)
                {
                    request.Abort();
                }

                return(this.ProcessAsyncResponse <TResponse>(getResponseAsync.Result as HttpWebResponse));
            }
            catch (AggregateException ae)
            {
                ae.Handle(e =>
                {
                    this.HandleException(e);
                    return(true);
                });
                return(default(TResponse));
            }
            catch (Exception e)
            {
                this.HandleException(e);
                return(default(TResponse));
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Sends the asynchronous.
        /// </summary>
        /// <typeparam name="TRequest">The type of the request.</typeparam>
        /// <typeparam name="TResponse">The type of the response.</typeparam>
        /// <param name="method">The method.</param>
        /// <param name="requestBody">The request body.</param>
        /// <param name="request">The request.</param>
        /// <param name="setHeadersCallback">The set headers callback.</param>
        /// <returns>The response object.</returns>
        /// <exception cref="System.ArgumentNullException">request</exception>
        protected async Task <TResponse> SendAsync <TRequest, TResponse>(string method, TRequest requestBody, WebRequest request, Action <WebRequest> setHeadersCallback = null)
        {
            try
            {
                if (request == null)
                {
                    throw new ArgumentNullException(nameof(request));
                }

                request.Method = method;
                request.Headers.Add("Ocp-Apim-Subscription-Key", this.SubscriptionKey);

                if (null == setHeadersCallback)
                {
                    if (string.IsNullOrWhiteSpace(request.ContentType))
                    {
                        this.SetCommonHeaders(request);
                    }
                }
                else
                {
                    setHeadersCallback(request);
                }

                if (requestBody is Stream)
                {
                    request.ContentType = $"image/jpeg";
                }

                var asyncState = new WebRequestAsyncState()
                {
                    RequestBytes = this.SerializeRequestBody(requestBody, request.ContentType),
                    WebRequest   = (HttpWebRequest)request,
                };

                var continueRequestAsyncState = await Task.Factory.FromAsync <Stream>(
                    asyncState.WebRequest.BeginGetRequestStream,
                    asyncState.WebRequest.EndGetRequestStream,
                    asyncState,
                    TaskCreationOptions.None).ContinueWith <WebRequestAsyncState>(
                    task =>
                {
                    var requestAsyncState = (WebRequestAsyncState)task.AsyncState;
                    if (requestBody != null)
                    {
                        using (var requestStream = task.Result)
                        {
                            if (requestBody is Stream)
                            {
                                (requestBody as Stream).CopyTo(requestStream);
                            }
                            else
                            {
                                requestStream.Write(requestAsyncState.RequestBytes, 0, requestAsyncState.RequestBytes.Length);
                            }
                        }
                    }

                    return(requestAsyncState);
                });

                var continueWebRequest = continueRequestAsyncState.WebRequest;
                var getResponse        = Task.Factory.FromAsync <WebResponse>(
                    continueWebRequest.BeginGetResponse,
                    continueWebRequest.EndGetResponse,
                    continueRequestAsyncState);

                await Task.WhenAny(getResponse, Task.Delay(this.DefaultTimeout));

                //Abort request if timeout has expired
                if (!getResponse.IsCompleted)
                {
                    request.Abort();
                }

                return(this.ProcessAsyncResponse <TResponse>(getResponse.Result as HttpWebResponse));
            }
            catch (AggregateException ae)
            {
                ae.Handle(e =>
                {
                    this.HandleException(e);
                    return(true);
                });
                return(default(TResponse));
            }
            catch (Exception e)
            {
                this.HandleException(e);
                return(default(TResponse));
            }
        }