我有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
。
答案 0 :(得分:6)
这可能是由IIS的路由约定引起的,当Uri包含点时,它会有自己的路由规则。 但是,在odata v4中,所有函数/动作调用都必须是名称空间限定的。然后在这样的Uri中会出现一个点,这将被IIS错误处理。
要摆脱这种情况,你可以尝试以下任何一种方法:
启用runAllManagedModulesForAllRequests,在Web.config中添加以下内容
&LT; system.webServer&GT;
&lt; modules runAllManagedModulesForAllRequests =“true”/&gt;
&LT; /system.webServer>
但此选项可能存在一些潜在问题,请参阅此post了解详细信息。
启用项目特定设置,在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?在他们可能持有的序列化时间看一下导航属性。在我的例子中,我删除所有导航属性只是为了测试,它的工作原理。