批处理中的ODataUri返回404,而如果我转到提供的url,它就工作了.为什么?
OData Uri in batch returns 404, while if i go to the url provided, it works. Why?
我正在使用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
- 如何检查这个代码点火器php函数是否工作,该函数是否在ajax url中使用
- 读取在具有IE的工作程序中生成的对象URL
- 由于存在标签('#')特殊字符,URL无法工作
- 部分html视图's控制器未使用KendoPanelBar内容URL在指令模板URL中工作
- 基于变量的Javascript URL重定向无法正常工作
- 为什么JavaScript URL表单无法工作,也无法重定向
- 如何正确创建带有“Url.Action”的查询字符串的网址,以便它在Firefox中工作
- FireFox 无法在 URL.revokeObjectURL 上正常工作
- CSS 在基于 URL 上工作,但不在网站的其他页面中使用.代码点火器
- Visual Studio IIS工作正常,但是当托管在IIS 7脚本中时,会得到错误的URL
- data-toggle='tab' or ='pills' 不允许 URL 工作
- 无法获取相对 URL 在 OpenLayers3 中的工作
- Ajax Post请求总是运行错误功能,尽管卷曲到相同的url工作正常
- 在暂存服务器中工作但在生产中失败的无效 URL
- 当我将变量附加到 URL 时,如何使 .load 工作
- JSONP回调不能从这个电影院url工作
- 填充多个输入字段与参数从Url..(工作)的一半
- 为什么这个事件.Url工作,而不是这个
- VTT(字幕)不能从外部url工作
- JSONLoader对象链接- URL工作正常,相对路径不行