【问题标题】:OData V4 batch request 'Content-ID' was not present in the header标头中不存在 OData V4 批处理请求“Content-ID”
【发布时间】:2018-02-15 09:13:19
【问题描述】:

我们的 OData 端点是自托管的 (OWIN)。对于单个请求:创建、更新、修补和删除一切都很好,但问题是当我发送批处理请求时。 我阅读了很多文章,但仍然无法解决问题。 在 OData 文档中它说: 我的问题是:如何将“Content-ID”设置为批处理请求的标头?

在端点批处理已启用:

HttpConfiguration config = new HttpConfiguration();
var odataBatchHandler = new DefaultODataBatchHandler(new HttpServer(config));
config.MapODataServiceRoute("ODataApi", null, builder.GetEdmModel(), odataBatchHandler);
config.Count().Filter().OrderBy().Expand().MaxTop(null).Select();
appBuilder.UseWebApi(config);

这里是测试:

 [TestMethod]
        public void BatchRequestTest()
        {
            var odataAddress = "https://localhost:23170/Sample/Sample/OData/";
            var batchUrl = $"{odataAddress}$batch";
            HttpClient http = new HttpClient();

            // Global batch request
            HttpRequestMessage batchRequest = new HttpRequestMessage(HttpMethod.Post, batchUrl);
            batchRequest.Headers.Authorization = new AuthenticationHeaderValue("Basic", "QWRtaW5pc3RyYXRvcjpwdw==");
            MultipartContent batchContent = new MultipartContent("mixed", "batch_" + Guid.NewGuid().ToString());

            // Third element: POST user creation
            // 1: a multipart content that represents the changeset container
            MultipartContent changeSet = new MultipartContent("mixed", "changeset_" + Guid.NewGuid().ToString());
            // 2: one request message object per post request
            HttpRequestMessage postRequest = new HttpRequestMessage(HttpMethod.Post, $"{odataAddress}/SATeacher");
            postRequest.Headers.Authorization = new AuthenticationHeaderValue("Basic", "QWRtaW5pc3RyYXRvcjpwdw==");

            postRequest.Content = new StringContent("", Encoding.UTF8, "application/json");
            // 3: one message content per corresponding post request
            HttpMessageContent postRequestContent = new HttpMessageContent(postRequest);
            postRequestContent.Headers.Remove("Content-Type");
            postRequestContent.Headers.Add("Content-Type", "application/http");
            postRequestContent.Headers.Add("Content-Transfer-Encoding", "binary");
            // Add this POST content to the changeset
            changeSet.Add(postRequestContent);
            // Add the changeset to the batch content
            batchContent.Add(changeSet);

            // Here we go
            batchRequest.Content = batchContent;
            HttpResponseMessage response = http.SendAsync(batchRequest).Result;
            var responseString = response.Content.ReadAsStringAsync().Result;
        }

这里有一个例外:

{"Message":"发生错误。","ExceptionMessage":"批处理操作的标头集合中不存在名为 'Content-ID' 的标头。","ExceptionType":"Microsoft .OData.ODataException","StackTrace":" 在 Microsoft.OData.ODataBatchReader.CreateOperationRequestMessageImplementation()\r\n 在 Microsoft.OData.ODataBatchReader.InterceptException[T](Func1 action)\r\n at Microsoft.OData.ODataBatchReader.CreateOperationRequestMessage()\r\n at System.Web.OData.Batch.ODataBatchReaderExtensions.<ReadOperationInternalAsync>d__6.MoveNext() in C:\\Builds\\Eagle\\Eagle\\Framework\\Server\\OData\\Source\\System.Web.OData\\OData\\Batch\\ODataBatchReaderExtensions.cs:line 149\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter1.GetResult()\r\n在 System.Web.OData.Batch.ODataBatchReaderExtensions.d__1.MoveNext() 在 C:\Builds\Eagle\Eagle\Framework\Server\OData\Source\System.Web.OData\OData\Batch\ODataBatchReaderExtensions.cs:line 63 \r\n--- 从先前引发异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\r\n 在 System.Runtime.CompilerServices。 TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter1.GetResult()\r\n at System.Web.OData.Batch.DefaultODataBatchHandler.<ParseBatchRequestsAsync>d__3.MoveNext() in C:\\Builds\\Eagle\\Eagle\\Framework\\Server\\OData\\Source\\System.Web.OData\\OData\\Batch\\DefaultODataBatchHandler.cs:line 141\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter1.GetResult()\r\n 在 System.Web.OData.Batch.DefaultODataBatchHandler.d_ _1.MoveNext() 在 C:\Builds\Eagle\Eagle\Framework\Server\OData\Source\System.Web.OData\OData\Batch\DefaultODataBatchHandler.cs:line 44\r\n--- 堆栈跟踪结束从先前引发异常的位置 ---\r\n System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n在 System.Web.Http.Batch.HttpBatchHandler.d__0.MoveNext()"}

获取异常:HttpResponseMessage response = http.SendAsync(batchRequest).Result;

有什么想法吗?

提前致谢,

【问题讨论】:

  • 我认为错误是描述性的。你可以试试postRequestContent.Headers.Add("Content-ID", "1");,更多信息,odata.org/documentation/odata-version-3-0/batch-processing
  • @JaliyaUdagedara 现在正在尝试...
  • 使用 Microsoft.OData.Client 测试它可能更容易。它在上下文中有一个方法 SaveChanges,该方法接受一个参数来允许批量请求。
  • @PraveenPaulose 听起来不错,我会试试的
  • @JaliyaUdagedara 您的评论有效,这很容易,谢谢。如果您发布答案,我将标记为正确答案

标签: c# odata owin


【解决方案1】:

我认为错误是描述性的。你可以试试吗,postRequestContent.Headers.Add("Content-ID", "1");

更多信息, http://www.odata.org/documentation/odata-version-3-0/batch-processing/

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2020-09-23
    • 2019-11-21
    • 2014-07-06
    相关资源
    最近更新 更多