批处理中的ODataUri返回404,而如果我转到提供的url,它就工作了.为什么?

OData Uri in batch returns 404, while if i go to the url provided, it works. Why?

本文关键字:url 工作 为什么 返回 ODataUri 批处理 如果      更新时间:2023-09-26

我正在使用ODataController来获取查询结果。控制器定义如下:

public class RunController : ODataController
{
    [EnableQuery(MaxNodeCount = 1000)]
    public IHttpActionResult Get() {
        ...
    }
}

如果我直接转到控制器,它会工作。我的路线设置好了,所以我会去这个URL:

http://localhost:58704/odata/Run

路由配置如下所示:

config.MapODataServiceRoute(
   routeName: "defaultOdata",
   routePrefix: "odata",
   model: GetModel(),
   batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));

GetModel()如下所示:

public static Microsoft.OData.Edm.IEdmModel GetModel()
{
    ODataModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<RunController.RunModel>("Run");
    return builder.GetEdmModel();
}

正如您所看到的,我已经启用了defaultOdataBatchHandler。

http://localhost:58704/odata/$batch

工作顺利。下一步是创建批处理语句,该语句由datajs完成,如下所示:

return OData.request({
    requestUri: "http://localhost:58704/odata/$batch",
    method: "POST",
    data: {
        __batchRequests: [
             {requestUri: "Run", method: "GET" }
        ]
    }
}, function (data, response) {
    console.log(data.__batchResponses);
}, undefined, OData.batchHandler);

批处理查询得到它所需要的内容,并返回一个HTTP200。这太棒了。内部转换为http://localhost:58704/odata/Run的查询返回HTTP 404。我一辈子都不明白为什么。

console.log(data.__batchResponses)的行返回一个具有消息属性的对象说;"HTTP请求失败",在回复中,主体表示:

"{"message":"No HTTP resource was found that matches the request URI 'http://localhost:58704/odata/Run'.","messageDetail":"No type was found that matches the controller named 'odata'."}"

如果我使用错误消息中显示的url,它可以正常工作。可能是批处理请求中的method: "GET"工作不正常吗?

根据您在ASP.NET Web API OData应用程序中使用的类和方法,我认为您使用的是OData V4。但是您的客户端(dataJS)不支持OData V4。您可以使用支持OData V4的apache odatajs,其代码如下:

window.odatajs.oData.request({
            requestUri: "/odata/$batch",
            method: "POST",
            data: {
                __batchRequests: [
                     { requestUri: "Products", method: "GET" }
                ]
            }
        }, function (data, response) {
            console.log(data.__batchResponses[0].data.value);
        }, undefined, window.odatajs.oData.batch.batchHandler);

不会有任何问题,两个库的API是相同的。

包含服务器端(ASP.NETWebneneneba API ODataV4)和客户端(apacheodajs)的完整示例可以在这里下载

https://github.com/ymoradi/samples/tree/master/NetFX/ASP.NET/ASP.NET%20Web%20API/OData/apache%20odatajs%20v4%20sample%20code

这是两个请求之间的区别:

odatajs request headers(successful one):
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json;q=0.9, */*;q=0.1
datajs request headers(failed one):
MaxDataServiceVersion: 3.0
DataServiceVersion: 1.0
Accept: application/atomsvc+xml;q=0.8, application/json;odata=fullmetadata;q=0.7, application/json;q=0.5, */*;q=0.1