header 中不存在 OData V4 批处理请求 'Content-ID'
OData V4 batch request 'Content-ID' was not present in the header
我们的 OData 端点是 self-hosted(OWIN)。对于单个请求:创建、更新、修补和删除一切都很好,但问题是当我发送批量请求时。
看了很多文章,还是解决不了问题。
在 OData 文档中它说:
我的问题是:如何将 'Content-ID' 设置为批处理请求的 header?
在端点批处理中启用:
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":"An error has occurred.","ExceptionMessage":"The header with name 'Content-ID' was not present in the header collection of the batch operation.","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.TaskAwaiter
1.GetResult()\r\n 在 System.Web.OData.Batch.ODataBatchReaderExtensions.d__1.MoveNext() in 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.TaskAwaiter
1.GetResult() \r\n at System.Web.OData.Batch.DefaultODataBatchHandler.d__1.MoveNext() in C:\Builds\Eagle\Eagle\Framework\Server\OData\Source\System.Web.OData\OData\Batch\DefaultODataBatchHandler.cs:line 44\r\n--- 结束来自先前抛出异常的位置的堆栈跟踪 --- \r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Batch.HttpBatchHandler.d__0.MoveNext()"}
正在获取异常:HttpResponseMessage response = http.SendAsync(batchRequest).Result;
有什么想法吗?
提前致谢,
我认为错误是描述性的。你能试试吗,postRequestContent.Headers.Add("Content-ID", "1");
,
更多信息,
http://www.odata.org/documentation/odata-version-3-0/batch-processing/
我们的 OData 端点是 self-hosted(OWIN)。对于单个请求:创建、更新、修补和删除一切都很好,但问题是当我发送批量请求时。 看了很多文章,还是解决不了问题。 在 OData 文档中它说: 我的问题是:如何将 'Content-ID' 设置为批处理请求的 header?
在端点批处理中启用:
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":"An error has occurred.","ExceptionMessage":"The header with name 'Content-ID' was not present in the header collection of the batch operation.","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.TaskAwaiter
1.GetResult()\r\n 在 System.Web.OData.Batch.ODataBatchReaderExtensions.d__1.MoveNext() in 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.TaskAwaiter
1.GetResult() \r\n at System.Web.OData.Batch.DefaultODataBatchHandler.d__1.MoveNext() in C:\Builds\Eagle\Eagle\Framework\Server\OData\Source\System.Web.OData\OData\Batch\DefaultODataBatchHandler.cs:line 44\r\n--- 结束来自先前抛出异常的位置的堆栈跟踪 --- \r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Batch.HttpBatchHandler.d__0.MoveNext()"}
正在获取异常:HttpResponseMessage response = http.SendAsync(batchRequest).Result;
有什么想法吗?
提前致谢,
我认为错误是描述性的。你能试试吗,postRequestContent.Headers.Add("Content-ID", "1");
,
更多信息, http://www.odata.org/documentation/odata-version-3-0/batch-processing/