2014-09-27 87 views
2

我有一个OData v4操作方法,它不工作;但是请注意,这是在OData v3工作正常(我显然在试图更新我的项目的过程)Web API 2:OData 4:操作返回404

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/ ..

也无法正常工作..我遵循了这封信的步骤......要么我在这里失明并且错过了某些东西,要么在的最新版本中存在严重问题为Web API

+0

检查此[post](http://stackoverflow.com/questions/32063196/odata-v4-function-always-returns-404/39438274#39438274)的解决方案。 – rdhainaut 2016-09-12 15:25:41

+0

如果你想要一个完整的解决方案, 检查此[答案](http://stackoverflow.com/questions/32063196/odata-v4-function-always-returns-404/39438274#39438274);)EtVoilà – rdhainaut 2016-09-12 15:27:33

回答

0

那么,这是几乎一年后,这个问题,我实际上试图再次移动到OData v4并有同样的问题。我在这里忘记了我原来的问题,并问了一个新问题,然后找到了答案。有关更多详情,请参阅OData v4 Function always returns 404。我很高兴地说现在一切都很好。

5

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

为了摆脱这一点,你可以尝试以下两种的:

  1. 打开runAllManagedModulesForAllRequests,加上Web.config中的以下

    <system.webServer>
        <模块runAllManagedModulesForAllRequests =“true”/ >
    </system。web服务器>

但有一点是该选项的一些潜在的问题,请参见本post查看详细。

  • 打开项目特定的设置,添加Web.config中的以下内容:

    <system.webServer>
            <处理程序>
                    <删除 名称= “ExtensionlessUrlHandler集成-4.0”  />
                    <添加 名= “ExtensionlessUrlHandler集成-4.0”  路径= “的OData/CMS *”  动词= “*”  类型= “System.Web.Handlers.TransferRequestHandler”  前提= “integratedMode,runtimeVersionv4.0”  />
            < /处理程序>
    </system.webServer>

  • +0

    谢谢。目前,我必须回滚到v3,因为我有很多工作要做。但是我会尽快尝试这个解决方案..在接下来的几天里,可能会回到你身边。欣赏这个建议,再次感谢。 – Matt 2014-09-30 00:49:56

    +0

    我发现ExtensionlessHandler-Integrated-4.0的处理程序已经存在于web.config中,但它的原始路径=“*。”,无法正常工作。如果你只是添加path =“*。*”,它可以处理odata路由的任何路径。这样你就不会将它限制为“odata/cms”。 – 2017-06-15 04:24:29

    3

    我有同样的问题,我解决了加入尾随斜杠的URL。在你的情况下,这将是/ odata/cms/Pages/Translate/

    0

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