internal static Task CreateODataBatchResponseAsync(this HttpRequest request, IEnumerable <ODataBatchResponseItem> responses, ODataMessageQuotas messageQuotas) { Contract.Assert(request != null); ODataVersion odataVersion = ODataInputFormatter.GetODataResponseVersion(request); IServiceProvider requestContainer = request.GetRequestContainer(); ODataMessageWriterSettings writerSettings = requestContainer.GetRequiredService <ODataMessageWriterSettings>(); writerSettings.Version = odataVersion; writerSettings.MessageQuotas = messageQuotas; HttpResponse response = request.HttpContext.Response; response.StatusCode = (int)HttpStatusCode.OK; // Need to get the stream from ODataBatchContent. // maybe use the shared class to define bahaviour and put // HttpContent and public stream getter in platform-specific? ODataBatchContent batchContent = new ODataBatchContent(responses, requestContainer); foreach (var header in batchContent.Headers) { // Copy headers from batch content, overwriting any existing headers. response.Headers[header.Key] = header.Value; } return(batchContent.SerializeToStreamAsync(response.Body)); }
internal static Task CreateODataBatchResponseAsync(this HttpRequest request, IEnumerable <ODataBatchResponseItem> responses, ODataMessageQuotas messageQuotas) { Contract.Assert(request != null); ODataVersion odataVersion = ODataInputFormatter.GetODataResponseVersion(request); IServiceProvider requestContainer = request.GetRequestContainer(); ODataMessageWriterSettings writerSettings = requestContainer.GetRequiredService <ODataMessageWriterSettings>(); writerSettings.Version = odataVersion; writerSettings.MessageQuotas = messageQuotas; HttpResponse response = request.HttpContext.Response; IEnumerable <MediaTypeHeaderValue> acceptHeaders = MediaTypeHeaderValue.ParseList(request.Headers.GetCommaSeparatedValues("Accept")); string responseContentType = null; foreach (MediaTypeHeaderValue acceptHeader in acceptHeaders.OrderByDescending(h => h.Quality == null ? 1 : h.Quality)) { if (acceptHeader.MediaType.Equals(ODataBatchHttpRequestExtensions.BatchMediaTypeMime, StringComparison.OrdinalIgnoreCase)) { responseContentType = String.Format(CultureInfo.InvariantCulture, "multipart/mixed;boundary=batchresponse_{0}", Guid.NewGuid()); break; } else if (acceptHeader.MediaType.Equals(ODataBatchHttpRequestExtensions.BatchMediaTypeJson, StringComparison.OrdinalIgnoreCase)) { responseContentType = ODataBatchHttpRequestExtensions.BatchMediaTypeJson; break; } } if (responseContentType == null) { // In absence of accept, if request was JSON then default response to be JSON. // Note that, if responseContentType is not set, then it will default to multipart/mixed // when constructing the BatchContent, so we don't need to handle that case here if (!String.IsNullOrEmpty(request.ContentType) && request.ContentType.IndexOf(ODataBatchHttpRequestExtensions.BatchMediaTypeJson, StringComparison.OrdinalIgnoreCase) > -1) { responseContentType = ODataBatchHttpRequestExtensions.BatchMediaTypeJson; } } response.StatusCode = (int)HttpStatusCode.OK; ODataBatchContent batchContent = new ODataBatchContent(responses, requestContainer, responseContentType); foreach (var header in batchContent.Headers) { // Copy headers from batch content, overwriting any existing headers. response.Headers[header.Key] = header.Value; } return(batchContent.SerializeToStreamAsync(response.Body)); }
internal static Task CreateODataBatchResponseAsync(this HttpRequest request, IEnumerable <ODataBatchResponseItem> responses, ODataMessageQuotas messageQuotas) { Contract.Assert(request != null); ODataVersion odataVersion = ODataInputFormatter.GetODataResponseVersion(request); IServiceProvider requestContainer = request.GetRequestContainer(); ODataMessageWriterSettings writerSettings = requestContainer.GetRequiredService <ODataMessageWriterSettings>(); writerSettings.Version = odataVersion; writerSettings.MessageQuotas = messageQuotas; HttpResponse response = request.HttpContext.Response; StringValues acceptHeader = request.Headers["Accept"]; string contentType = null; if (StringValues.IsNullOrEmpty(acceptHeader) || acceptHeader.Any(h => h.Equals(ODataBatchHttpRequestExtensions.BatchMediaTypeMime, StringComparison.OrdinalIgnoreCase))) { contentType = String.Format(CultureInfo.InvariantCulture, "multipart/mixed;boundary=batchresponse_{0}", Guid.NewGuid()); } else if (acceptHeader.Any(h => h.Equals(ODataBatchHttpRequestExtensions.BatchMediaTypeJson, StringComparison.OrdinalIgnoreCase))) { contentType = ODataBatchHttpRequestExtensions.BatchMediaTypeJson; } response.StatusCode = (int)HttpStatusCode.OK; ODataBatchContent batchContent = new ODataBatchContent(responses, requestContainer, contentType); foreach (var header in batchContent.Headers) { // Copy headers from batch content, overwriting any existing headers. response.Headers[header.Key] = header.Value; } return(batchContent.SerializeToStreamAsync(response.Body)); }