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

Mat*_*att 3 odata asp.net-web-api asp.net-web-api2

我有一个OData v4不起作用的动作方法; 但请注意它工作正常OData v3(我显然正在尝试更新我的项目)

OData行动方法:

[HttpPost]
public Translation Translate(ODataActionParameters parameters)
{
    // Implementation
}
Run Code Online (Sandbox Code Playgroud)

组态:

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());
Run Code Online (Sandbox Code Playgroud)

客户端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
Run Code Online (Sandbox Code Playgroud)

我试着看看版本4中OData操作的设置是否有任何改变,但看起来是一样的(参考:使用ASP.NET Web API 2.2的OData v4中的动作和功能)

编辑

我发现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/ ..

也没有工作.我已经按照步骤的信......无论我是盲人,在这里失去了一些东西或者有与最新版本的一个严重问题ODataWeb API.

Kar*_*ata 7

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

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

  1. 打开runAllManagedModulesForAllRequests,在Web.config中添加以下内容

    <system.webServer>
      <modules runAllManagedModulesForAllRequests ="true"/>
    </system.webServer>

但是此选项可能存在一些潜在问题,请参阅此帖以获取详细信息.

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

    <system.webServer>
        <handlers>
            <remove name ="ExtensionlessUrlHandler-Integrated-4.0"/>
            <add name ="ExtensionlessUrlHandler-Integrated-4.0"path ="odata/cms*"verb ="*"type ="System. Web.Handlers.TransferRequestHandler"preCondition ="integratedMode,runtimeVersionv4.0"/>
        </ handlers>
    </system.webServer>


小智 5

我遇到了同样的问题,我解决了在URL末尾添加斜杠的问题。在您的情况下,它将是/ odata / cms / Pages / Translate /