Beispiel #1
0
        public async Task AssignBatchActionResultsAsync(IODataClient client,
                                                        ODataResponse batchResponse, IList <Func <IODataClient, Task> > actions, IList <int> responseIndexes)
        {
            var exceptions = new List <Exception>();

            for (var actionIndex = 0; actionIndex < actions.Count && !exceptions.Any(); actionIndex++)
            {
                var responseIndex = responseIndexes[actionIndex];
                if (responseIndex >= 0 && responseIndex < batchResponse.Batch.Count)
                {
                    var actionResponse = batchResponse.Batch[responseIndex];
                    if (actionResponse.Exception != null)
                    {
                        exceptions.Add(actionResponse.Exception);
                    }
                    else if (actionResponse.StatusCode >= (int)HttpStatusCode.BadRequest)
                    {
                        exceptions.Add(WebRequestException.CreateFromStatusCode((HttpStatusCode)actionResponse.StatusCode));
                    }
                    else
                    {
                        await actions[actionIndex](new ODataClient(client as ODataClient, actionResponse)).ConfigureAwait(false);
                    }
                }
            }

            if (exceptions.Any())
            {
                throw exceptions.First();
            }
        }
Beispiel #2
0
 /// <summary>
 /// Transforms and throws the <see cref="IBusinessException"/> equivalent for an <see cref="Soc.WebRequestException"/>.
 /// </summary>
 /// <param name="wrex">The <see cref="Soc.WebRequestException"/>.</param>
 public static void ThrowTransformedODataException(Soc.WebRequestException wrex)
 {
     if (wrex == null)
     {
         throw new ArgumentNullException(nameof(wrex));
     }
 }
Beispiel #3
0
        private void WriteFeed(Edm edm, string absolutUri, string entitySetName, IList <IDictionary <string, object> > dataList)
        {
            ODataClient client = new ODataClient(new System.Uri(url));
            ODataBatch  batch  = new ODataBatch(client);

            foreach (IDictionary <string, object> data in dataList)
            {
                batch += c => client.For("Entry").Set(data).InsertEntryAsync();
            }

            System.Threading.Tasks.Task task = batch.ExecuteAsync();
            WaitForTaskToComplete(task);

            Exception e = task.Exception;

            if (e != null)
            {
                if (e.InnerException is Simple.OData.Client.WebRequestException)
                {
                    // this means we got a response from the server with a specific message.
                    Simple.OData.Client.WebRequestException inner = (Simple.OData.Client.WebRequestException)e.InnerException;
                    throw new System.Exception(inner.Message + " : " + inner.Response);
                }
                throw e;
            }
        }
Beispiel #4
0
        private ODataEntry WriteEntity(Edm edm, string url, string entitySetName, IDictionary <string, object> data)
        {
            ODataClient client = new ODataClient(new System.Uri(url));

            System.Threading.Tasks.Task <IDictionary <string, object> > task = client.For(entitySetName).Set(data).InsertEntryAsync();
            WaitForTaskToComplete(task);

            Exception e = task.Exception;

            if (e != null)
            {
                if (e.InnerException is Simple.OData.Client.WebRequestException)
                {
                    // this means we got a response from the server with a specific message.
                    Simple.OData.Client.WebRequestException inner = (Simple.OData.Client.WebRequestException)e.InnerException;
                    NeotysAPIException napie = NeotysAPIException.Parse(inner.Response);
                    if (napie != null)
                    {
                        throw napie;
                    }
                    throw inner;
                }
                throw e;
            }

            IDictionary <string, object> result = task.Result;
            ODataEntry returnValue = new ODataEntry(result);

            return(returnValue);
        }
Beispiel #5
0
        private async Task ExecuteBatchActionsAsync(IList <Func <IODataClient, Task> > actions, CancellationToken cancellationToken)
        {
            if (!actions.Any())
            {
                return;
            }

            var responseIndexes = new List <int>();

            // Write batch operations into a batch content
            var lastOperationId = 0;

            foreach (var action in actions)
            {
                await action(this);

                var responseIndex = -1;
                if (_lazyBatchWriter.Value.LastOperationId > lastOperationId)
                {
                    lastOperationId = _lazyBatchWriter.Value.LastOperationId;
                    responseIndex   = lastOperationId - 1;
                }
                responseIndexes.Add(responseIndex);
            }

            if (_lazyBatchWriter.Value.HasOperations)
            {
                // Create batch request message
                var requestMessage = await _lazyBatchWriter.Value.EndBatchAsync();

                var request = new ODataRequest(RestVerbs.Post, _session, ODataLiteral.Batch, requestMessage);

                // Execute batch and get response
                ODataResponse batchResponse;
                using (var response = await _requestRunner.ExecuteRequestAsync(request, cancellationToken))
                {
                    var responseReader = _session.Adapter.GetResponseReader();
                    batchResponse = await responseReader.GetResponseAsync(response);
                }

                // Replay batch operations to assign results
                for (int actionIndex = 0; actionIndex < actions.Count; actionIndex++)
                {
                    var responseIndex = responseIndexes[actionIndex];
                    if (responseIndex >= 0)
                    {
                        var actionResponse = batchResponse.Batch[responseIndex];
                        if (actionResponse.StatusCode >= 400)
                        {
                            throw WebRequestException.CreateFromStatusCode((HttpStatusCode)actionResponse.StatusCode);
                        }

                        var   client = new ODataClient(this, actionResponse);
                        await actions[actionIndex](client);
                    }
                }
            }
        }
Beispiel #6
0
        public async Task <HttpResponseMessage> ExecuteRequestAsync(ODataRequest request, CancellationToken cancellationToken)
        {
            try
            {
                var messageHandler = CreateMessageHandler(request);

                using (var httpClient = CreateHttpClient(messageHandler))
                {
                    PreExecute(httpClient, request);

                    _session.Trace("{0} request: {1}", request.Method, request.RequestMessage.RequestUri.AbsoluteUri);
#if TRACE_REQUEST_CONTENT
                    if (request.RequestMessage.Content != null)
                    {
                        var content = await request.RequestMessage.Content.ReadAsStringAsync();

                        _session.Trace("Request content:{0}{1}", Environment.NewLine, content);
                    }
#endif

                    var response = await httpClient.SendAsync(request.RequestMessage, cancellationToken);

                    if (cancellationToken.IsCancellationRequested)
                    {
                        cancellationToken.ThrowIfCancellationRequested();
                    }

                    _session.Trace("Request completed: {0}", response.StatusCode);
#if TRACE_RESPONSE_CONTENT
                    if (response.Content != null)
                    {
                        var content = await response.Content.ReadAsStringAsync();

                        _session.Trace("Response content:{0}{1}", Environment.NewLine, content);
                    }
#endif

                    PostExecute(response);
                    return(response);
                }
            }
            catch (WebException ex)
            {
                throw WebRequestException.CreateFromWebException(ex);
            }
            catch (AggregateException ex)
            {
                if (ex.InnerException is WebException)
                {
                    throw WebRequestException.CreateFromWebException(ex.InnerException as WebException);
                }
                else
                {
                    throw;
                }
            }
        }
Beispiel #7
0
 public HttpWebResponse TryRequest(HttpWebRequest request)
 {
     try
     {
         return((HttpWebResponse)request.GetResponse());
     }
     catch (WebException ex)
     {
         throw WebRequestException.CreateFromWebException(ex);
     }
 }
        private async Task PostExecute(HttpResponseMessage responseMessage)
        {
            if (_session.Settings.AfterResponse != null)
            {
                _session.Settings.AfterResponse(responseMessage);
            }

            if (!responseMessage.IsSuccessStatusCode)
            {
                throw await WebRequestException.CreateFromResponseMessageAsync(responseMessage);
            }
        }
        private async Task PostExecute(HttpResponseMessage responseMessage)
        {
            _session.Settings.AfterResponse?.Invoke(responseMessage);
            if (_session.Settings.AfterResponseAsync != null)
            {
                await _session.Settings.AfterResponseAsync(responseMessage).ConfigureAwait(false);
            }

            if (!responseMessage.IsSuccessStatusCode)
            {
                throw await WebRequestException.CreateFromResponseMessageAsync(responseMessage, _session.Settings.WebRequestExceptionMessageSource).ConfigureAwait(false);
            }
        }
 public static ODataResponse FromStatusCode(int statusCode, Stream responseStream)
 {
     if (statusCode >= (int)HttpStatusCode.BadRequest)
     {
         var responseContent = Utils.StreamToString(responseStream, true);
         return(new ODataResponse
         {
             StatusCode = statusCode,
             Exception = WebRequestException.CreateFromStatusCode((HttpStatusCode)statusCode, responseContent),
         });
     }
     else
     {
         return(new ODataResponse
         {
             StatusCode = statusCode,
         });
     }
 }
Beispiel #11
0
 internal static ODataResponse FromStatusCode(ITypeCache typeCache, int statusCode, IEnumerable <KeyValuePair <string, string> > headers, Stream responseStream, WebRequestExceptionMessageSource exceptionMessageSource)
 {
     if (statusCode >= (int)HttpStatusCode.BadRequest)
     {
         var responseContent = Utils.StreamToString(responseStream, true);
         return(new ODataResponse(typeCache)
         {
             StatusCode = statusCode,
             Exception = WebRequestException.CreateFromStatusCode((HttpStatusCode)statusCode, exceptionMessageSource, responseContent),
             Headers = headers
         });
     }
     else
     {
         return(new ODataResponse(typeCache)
         {
             StatusCode = statusCode,
             Headers = headers
         });
     }
 }
 private bool IsResourceNotFoundException(WebRequestException ex)
 {
     var innerException = ex.InnerException as WebException;
     if (innerException != null)
     {
         var statusCode = (innerException.Response as HttpWebResponse).StatusCode;
         return statusCode == HttpStatusCode.NotFound;
     }
     return false;
 }
        public async Task <HttpResponseMessage> ExecuteRequestAsync(ODataRequest request, CancellationToken cancellationToken)
        {
            HttpConnection httpConnection = null;

            try
            {
                httpConnection = _session.Settings.RenewHttpConnection
                    ? new HttpConnection(_session.Settings)
                    : _session.GetHttpConnection();

                PreExecute(httpConnection.HttpClient, request);

                _session.Trace("{0} request: {1}", request.Method, request.RequestMessage.RequestUri.AbsoluteUri);
#if TRACE_REQUEST_CONTENT
                if (request.RequestMessage.Content != null)
                {
                    var content = await request.RequestMessage.Content.ReadAsStringAsync();

                    _session.Trace("Request content:{0}{1}", Environment.NewLine, content);
                }
#endif

                var response = await httpConnection.HttpClient.SendAsync(request.RequestMessage, cancellationToken);

                if (cancellationToken.IsCancellationRequested)
                {
                    cancellationToken.ThrowIfCancellationRequested();
                }

                _session.Trace("Request completed: {0}", response.StatusCode);
#if TRACE_RESPONSE_CONTENT
                if (response.Content != null)
                {
                    var content = await response.Content.ReadAsStringAsync();

                    _session.Trace("Response content:{0}{1}", Environment.NewLine, content);
                }
#endif

                await PostExecute(response);

                return(response);
            }
            catch (WebException ex)
            {
                throw WebRequestException.CreateFromWebException(ex);
            }
            catch (AggregateException ex)
            {
                if (ex.InnerException is WebException)
                {
                    throw WebRequestException.CreateFromWebException(ex.InnerException as WebException);
                }
                else
                {
                    throw;
                }
            }
            finally
            {
                if (httpConnection != null && _session.Settings.RenewHttpConnection)
                {
                    httpConnection.Dispose();
                }
            }
        }
        public async Task <HttpResponseMessage> ExecuteRequestAsync(ODataRequest request, CancellationToken cancellationToken)
        {
            HttpConnection httpConnection = null;

            try
            {
                await PreExecuteAsync(request).ConfigureAwait(false);

                _session.Trace("{0} request: {1}", request.Method, request.RequestMessage.RequestUri.AbsoluteUri);
                if (request.RequestMessage.Content != null && (_session.Settings.TraceFilter & ODataTrace.RequestContent) != 0)
                {
                    var content = await request.RequestMessage.Content.ReadAsStringAsync().ConfigureAwait(false);

                    _session.Trace("Request content:{0}{1}", Environment.NewLine, content);
                }

                HttpResponseMessage response;
                if (_session.Settings.RequestExecutor != null)
                {
                    response = await _session.Settings.RequestExecutor(request.RequestMessage);
                }
                else
                {
                    httpConnection = _session.Settings.RenewHttpConnection
                        ? new HttpConnection(_session.Settings)
                        : _session.GetHttpConnection();

                    response = await httpConnection.HttpClient.SendAsync(request.RequestMessage, cancellationToken).ConfigureAwait(false);

                    if (cancellationToken.IsCancellationRequested)
                    {
                        cancellationToken.ThrowIfCancellationRequested();
                    }
                }

                _session.Trace("Request completed: {0}", response.StatusCode);
                if (response.Content != null && (_session.Settings.TraceFilter & ODataTrace.ResponseContent) != 0)
                {
                    var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                    _session.Trace("Response content:{0}{1}", Environment.NewLine, content);
                }

                await PostExecute(response).ConfigureAwait(false);

                return(response);
            }
            catch (WebException ex)
            {
                throw WebRequestException.CreateFromWebException(ex);
            }
            catch (AggregateException ex)
            {
                if (ex.InnerException is WebException)
                {
                    throw WebRequestException.CreateFromWebException(ex.InnerException as WebException);
                }
                else
                {
                    throw;
                }
            }
            finally
            {
                if (httpConnection != null && _session.Settings.RenewHttpConnection)
                {
                    httpConnection.Dispose();
                }
            }
        }
 private bool IsResourceNotFoundException(WebRequestException ex)
 {
     return ex.Code == HttpStatusCode.NotFound;
 }