public virtual async Task <IList <ODataBatchResponseItem> > ExecuteRequestMessagesAsync(IEnumerable <ODataBatchRequestItem> requests, RequestDelegate handler) { if (requests == null) { throw new ArgumentNullException(nameof(requests)); } if (handler == null) { throw new ArgumentNullException(nameof(handler)); } IList <ODataBatchResponseItem> responses = new List <ODataBatchResponseItem>(); foreach (ODataBatchRequestItem request in requests) { ODataBatchResponseItem responseItem = await request.SendRequestAsync(handler).ConfigureAwait(false); responses.Add(responseItem); if (responseItem != null && responseItem.IsResponseSuccessful() == false && ContinueOnError == false) { break; } } return(responses); }
public override async Task ProcessBatchAsync(HttpContext context, RequestDelegate nextHandler) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (nextHandler == null) { throw new ArgumentNullException(nameof(nextHandler)); } if (!await ValidateRequest(context.Request).ConfigureAwait(false)) { return; } // This container is for the overall batch request. HttpRequest request = context.Request; IServiceProvider requestContainer = request.CreateRouteServices(PrefixName); requestContainer.GetRequiredService <ODataMessageReaderSettings>().BaseUri = GetBaseUri(request); // How to dispose it? ODataMessageReader reader = request.GetODataMessageReader(requestContainer); ODataBatchReader batchReader = await reader.CreateODataBatchReaderAsync().ConfigureAwait(false); List <ODataBatchResponseItem> responses = new List <ODataBatchResponseItem>(); Guid batchId = Guid.NewGuid(); ODataOptions options = context.RequestServices.GetRequiredService <IOptions <ODataOptions> >().Value; bool enableContinueOnErrorHeader = (options != null) ? options.EnableContinueOnErrorHeader : false; SetContinueOnError(request.Headers, enableContinueOnErrorHeader); while (await batchReader.ReadAsync().ConfigureAwait(false)) { ODataBatchResponseItem responseItem = null; if (batchReader.State == ODataBatchReaderState.ChangesetStart) { responseItem = await ExecuteChangeSetAsync(batchReader, batchId, request, nextHandler).ConfigureAwait(false); } else if (batchReader.State == ODataBatchReaderState.Operation) { responseItem = await ExecuteOperationAsync(batchReader, batchId, request, nextHandler).ConfigureAwait(false); } if (responseItem != null) { responses.Add(responseItem); if (responseItem.IsResponseSuccessful() == false && ContinueOnError == false) { break; } } } await CreateResponseMessageAsync(responses, request).ConfigureAwait(false); }