/// <summary> /// Executes the operation. /// </summary> /// <param name="batchReader">The batch reader.</param> /// <param name="batchId">The batch id.</param> /// <param name="originalRequest">The original request containing all the batch requests.</param> /// <param name="cancellationToken">The token to monitor for cancellation requests.</param> /// <returns>The response for the operation.</returns> public virtual async Task <ODataBatchResponseItem> ExecuteOperationAsync(ODataBatchReader batchReader, Guid batchId, HttpRequestMessage originalRequest, CancellationToken cancellationToken) { if (batchReader == null) { throw Error.ArgumentNull("batchReader"); } if (originalRequest == null) { throw Error.ArgumentNull("originalRequest"); } cancellationToken.ThrowIfCancellationRequested(); HttpRequestMessage operationRequest = await batchReader.ReadOperationRequestAsync(batchId, bufferContentStream : false); operationRequest.CopyBatchRequestProperties(originalRequest); operationRequest.DeleteRequestContainer(false); OperationRequestItem operation = new OperationRequestItem(operationRequest); try { ODataBatchResponseItem response = await operation.SendRequestAsync(Invoker, cancellationToken); return(response); } finally { originalRequest.RegisterForDispose(operation.GetResourcesForDisposal()); originalRequest.RegisterForDispose(operation); } }
public virtual async Task <IList <ODataBatchResponseItem> > ExecuteRequestMessagesAsync(IEnumerable <ODataBatchRequestItem> requests, RequestDelegate handler) { if (requests == null) { throw Error.ArgumentNull("requests"); } if (handler == null) { throw Error.ArgumentNull("handler"); } IList <ODataBatchResponseItem> responses = new List <ODataBatchResponseItem>(); foreach (ODataBatchRequestItem request in requests) { ODataBatchResponseItem responseItem = await request.SendRequestAsync(handler); responses.Add(responseItem); if (responseItem != null && responseItem.IsResponseSuccessful() == false && ContinueOnError == false) { break; } } return(responses); }
/// <summary> /// Executes the operation. /// </summary> /// <param name="batchReader">The batch reader.</param> /// <param name="batchId">The batch id.</param> /// <param name="originalRequest">The original request containing all the batch requests.</param> /// <param name="handler">The handler for processing a message.</param> /// <returns>The response for the operation.</returns> public virtual async Task <ODataBatchResponseItem> ExecuteOperationAsync(ODataBatchReader batchReader, Guid batchId, HttpRequest originalRequest, RequestDelegate handler) { if (batchReader == null) { throw Error.ArgumentNull("batchReader"); } if (originalRequest == null) { throw Error.ArgumentNull("originalRequest"); } if (handler == null) { throw Error.ArgumentNull("handler"); } CancellationToken cancellationToken = originalRequest.HttpContext.RequestAborted; cancellationToken.ThrowIfCancellationRequested(); HttpContext operationContext = await batchReader.ReadOperationRequestAsync(originalRequest.HttpContext, batchId, false, cancellationToken); operationContext.Request.CopyBatchRequestProperties(originalRequest); operationContext.Request.DeleteRequestContainer(false); OperationRequestItem operation = new OperationRequestItem(operationContext); ODataBatchResponseItem responseItem = await operation.SendRequestAsync(handler); return(responseItem); }
/// <inheritdoc/> public override async Task ProcessBatchAsync(HttpContext context, RequestDelegate nextHandler) { if (context == null) { throw Error.ArgumentNull("context"); } if (nextHandler == null) { throw Error.ArgumentNull("nextHandler"); } if (!await ValidateRequest(context.Request)) { return; } // This container is for the overall batch request. HttpRequest request = context.Request; IServiceProvider requestContainer = request.CreateRequestContainer(ODataRouteName); requestContainer.GetRequiredService <ODataMessageReaderSettings>().BaseUri = GetBaseUri(request); ODataMessageReader reader = request.GetODataMessageReader(requestContainer); ODataBatchReader batchReader = await reader.CreateODataBatchReaderAsync(); List <ODataBatchResponseItem> responses = new List <ODataBatchResponseItem>(); Guid batchId = Guid.NewGuid(); ODataOptions options = context.RequestServices.GetRequiredService <ODataOptions>(); bool enableContinueOnErrorHeader = (options != null) ? options.EnableContinueOnErrorHeader : false; SetContinueOnError(new WebApiRequestHeaders(request.Headers), enableContinueOnErrorHeader); while (await batchReader.ReadAsync()) { ODataBatchResponseItem responseItem = null; if (batchReader.State == ODataBatchReaderState.ChangesetStart) { responseItem = await ExecuteChangeSetAsync(batchReader, batchId, request, nextHandler); } else if (batchReader.State == ODataBatchReaderState.Operation) { responseItem = await ExecuteOperationAsync(batchReader, batchId, request, nextHandler); } if (responseItem != null) { responses.Add(responseItem); if (responseItem.IsResponseSuccessful() == false && ContinueOnError == false) { break; } } } await CreateResponseMessageAsync(responses, request); }
public virtual async Task <IList <ODataBatchResponseItem> > ExecuteRequestMessagesAsync(IEnumerable <ODataBatchRequestItem> requests, CancellationToken cancellationToken) { if (requests == null) { throw Error.ArgumentNull("requests"); } IList <ODataBatchResponseItem> responses = new List <ODataBatchResponseItem>(); try { foreach (ODataBatchRequestItem request in requests) { ODataBatchResponseItem responseItem = await request.SendRequestAsync(Invoker, cancellationToken); responses.Add(responseItem); if (responseItem != null && responseItem.IsResponseSuccessful() == false && ContinueOnError == false) { break; } } } catch { foreach (ODataBatchResponseItem response in responses) { if (response != null) { response.Dispose(); } } throw; } return(responses); }
/// <inheritdoc/> public override async Task <HttpResponseMessage> ProcessBatchAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (request == null) { throw Error.ArgumentNull("request"); } ValidateRequest(request); // This container is for the overall batch request. IServiceProvider requestContainer = request.CreateRequestContainer(ODataRouteName); requestContainer.GetRequiredService <ODataMessageReaderSettings>().BaseUri = GetBaseUri(request); ODataMessageReader reader = await request.Content.GetODataMessageReaderAsync(requestContainer, cancellationToken); request.RegisterForDispose(reader); ODataBatchReader batchReader = reader.CreateODataBatchReader(); List <ODataBatchResponseItem> responses = new List <ODataBatchResponseItem>(); Guid batchId = Guid.NewGuid(); HttpConfiguration configuration = request.GetConfiguration(); bool enableContinueOnErrorHeader = (configuration != null) ? configuration.HasEnabledContinueOnErrorHeader() : false; SetContinueOnError(new WebApiRequestHeaders(request.Headers), enableContinueOnErrorHeader); try { while (batchReader.Read()) { ODataBatchResponseItem responseItem = null; if (batchReader.State == ODataBatchReaderState.ChangesetStart) { responseItem = await ExecuteChangeSetAsync(batchReader, batchId, request, cancellationToken); } else if (batchReader.State == ODataBatchReaderState.Operation) { responseItem = await ExecuteOperationAsync(batchReader, batchId, request, cancellationToken); } if (responseItem != null) { responses.Add(responseItem); if (responseItem.IsResponseSuccessful() == false && ContinueOnError == false) { break; } } } } catch { foreach (ODataBatchResponseItem response in responses) { if (response != null) { response.Dispose(); } } throw; } return(await CreateResponseMessageAsync(responses, request, cancellationToken)); }