/// <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); OperationRequestItem operation = new OperationRequestItem(operationRequest); try { ODataBatchResponseItem response = await operation.SendRequestAsync(Invoker, cancellationToken); return(response); } finally { originalRequest.RegisterForDispose(operation.GetResourcesForDisposal()); originalRequest.RegisterForDispose(operation); } }
/// <inheritdoc/> public override async Task <HttpResponseMessage> ProcessBatchAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (request == null) { throw Error.ArgumentNull("request"); } ValidateRequest(request); ODataMessageReaderSettings oDataReaderSettings = new ODataMessageReaderSettings { DisableMessageStreamDisposal = true, MessageQuotas = MessageQuotas, BaseUri = GetBaseUri(request) }; cancellationToken.ThrowIfCancellationRequested(); ODataMessageReader reader = await request.Content.GetODataMessageReaderAsync(oDataReaderSettings); request.RegisterForDispose(reader); ODataBatchReader batchReader = reader.CreateODataBatchReader(); List <ODataBatchResponseItem> responses = new List <ODataBatchResponseItem>(); Guid batchId = Guid.NewGuid(); List <IDisposable> resourcesToDispose = new List <IDisposable>(); 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); } } } catch { foreach (ODataBatchResponseItem response in responses) { if (response != null) { response.Dispose(); } } throw; } return(await CreateResponseMessageAsync(responses, request, cancellationToken)); }
public void CreateResponseMessageAsync_ReturnsODataBatchContent() { DefaultODataBatchHandler batchHandler = new DefaultODataBatchHandler(new HttpServer()); ODataBatchResponseItem[] responses = new ODataBatchResponseItem[] { new OperationResponseItem(new HttpResponseMessage(HttpStatusCode.OK)) }; HttpResponseMessage response = batchHandler.CreateResponseMessageAsync(responses, new HttpRequestMessage()).Result; var batchContent = Assert.IsType<ODataBatchContent>(response.Content); Assert.Equal(1, batchContent.Responses.Count()); }