Web API 2:OData 4:操作返回404

时间:2014-09-27 05:09:22

标签: asp.net-web-api odata asp.net-web-api2

我有OData v4动作方法无效;但请注意它在OData v3中工作正常(我显然正在尝试更新我的项目)

OData行动方法:

[HttpPost]
public Translation Translate(ODataActionParameters parameters)
{
    // Implementation
}

配置:

ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Page>("Pages");
//etc (Other Entity Sets)

var pageEntityType = builder.EntityType<Page>();
var translateAction = pageEntityType.Collection.Action("Translate");
translateAction.Parameter<Guid>("pageId");
translateAction.Parameter<string>("cultureCode");
translateAction.Returns<Translation>();

//etc (Other Actions)

var route = config.MapODataServiceRoute("OData_CMS", "odata/cms", builder.GetEdmModel());

客户端AJAX调用:

var data = {
    pageId: $("#CultureSelector_PageId").val(),
    cultureCode: $("#CultureSelector_CultureCode").val()
};

$.ajax({
    url: "/odata/cms/Pages/Translate",
    type: "POST",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify(data),
    dataType: "json",
    async: false
})
.done(function (json) {
    //etc

我试着看看版本4中OData操作的设置是否有任何改变,但看起来是一样的(参考:Actions and Functions in OData v4 Using ASP.NET Web API 2.2

修改

我发现OData v4使用了Default命名空间并实现了它,如下所示:

首先,只需将我的AJAX调用更改为:

url: "/odata/cms/Pages/Default.Translate",

那不起作用,所以我也补充说:

[ODataRoute("Default.Translate")]

[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]

根据此链接中的说明操作我的操作:http://damienbod.wordpress.com/2014/06/16/web-api-and-odata-v4-crud-and-actions-part-3/ ..

也没有工作..我已经按照信件的步骤进行了操作......要么我在这里或那里失明并且遗失了某些内容,而OData的最新版本存在严重问题Web API

4 个答案:

答案 0 :(得分:6)

这可能是由IIS的路由约定引起的,当Uri包含点时,它会有自己的路由规则。 但是,在odata v4中,所有函数/动作调用都必须是名称空间限定的。然后在这样的Uri中会出现一个点,这将被IIS错误处理。

要摆脱这种情况,你可以尝试以下任何一种方法:

  1. 启用runAllManagedModulesForAllRequests,在Web.config中添加以下内容

    &LT; system.webServer&GT;
    &lt; modules runAllManagedModulesForAllRequests =“true”/&gt;
    &LT; /system.webServer>

  2. 但此选项可能存在一些潜在问题,请参阅此post了解详细信息。

    1. 启用项目特定设置,在Web.config中添加以下内容:

      &LT; system.webServer&GT;
      &LT;处理&GT;
      &LT;清除名称= “ExtensionlessUrlHandler集成-4.0”/&GT;
      &LT;添加名称= “ExtensionlessUrlHandler集成-4.0” 路径= “的OData / CMS *” 动词= “*” 类型= “System.Web.Handlers.TransferRequestHandler” 前提= “integratedMode,runtimeVersionv4.0”/&GT; <无线电通信/> &LT; /处理程序&GT;
      &LT; /system.webServer>

答案 1 :(得分:4)

我遇到了同样的问题,我解决了在网址上添加一个尾部斜杠。在你的情况下,它将是/ odata / cms / Pages / Translate /

答案 2 :(得分:0)

嗯,在这个问题差不多一年之后,我实际上再次尝试转移到 OData v4 并遇到了同样的问题。我在这里忘记了原来的问题并且问了一个新的问题,然后找到了答案。有关详细信息,请参阅OData v4 Function always returns 404。我很高兴现在一切都很好。

答案 3 :(得分:0)

您是否使用Entity Framework Database First Approuche?在他们可能持有的序列化时间看一下导航属性。在我的例子中,我删除所有导航属性只是为了测试,它的工作原理。