I have an OData v4
action method which is not working; note however that it was working fine in OData v3
(I am obviously in the process of trying to update my project)
OData Action Method:
[HttpPost]
public Translation Translate(ODataActionParameters parameters)
{
// Implementation
}
Configuration:
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());
Client AJAX Call:
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
I tried to see if anything has changed regarding setup for OData actions in version 4, but it seems the same (refer to: Actions and Functions in OData v4 Using ASP.NET Web API 2.2)
EDIT
I found out that OData v4
uses a Default
namespace and implemented that, as follows:
Firstly, just by changing my AJAX call to:
url: "/odata/cms/Pages/Default.Translate",
That didn't work, so I also added:
[ODataRoute("Default.Translate")]
and
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
to my action, as per the instructions at this link: http://damienbod.wordpress.com/2014/06/16/web-api-and-odata-v4-crud-and-actions-part-3/..
Also not working.. I have followed the steps to the letter... either I'm being blind and missing something here or there's a serious problem with the latest version of OData
for Web API
.
This may be caused by the routing convention of IIS, which would have its own routing rule when Uri contains dot. In odata v4, however, all function/action calls are required to be namespace qualified. Then there would be a dot appearing in such Uri, which would be mis-handled by IIS.
To get rid of this, you could try either of followings:
Turn on runAllManagedModulesForAllRequests, add the following in Web.config
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
But there can be some potential issue for this option, please refer to this post for detail.
Turn on project specific settings, add the following in 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>
I had the same problem and I solved adding a trailing slash to the url. In your case it would be /odata/cms/Pages/Translate/
Well, it was almost a year after this question that I actually tried moving to OData v4 again and had the same problem. I forgot about my original question here and asked a new one and then found the answer. See OData v4 Function always returns 404 for more details. I'm glad to say all is working well now.
Do you use Entity Framework Database First Approuche? Take a look at navigation properties, at serialization time they may be holding. In my case, I remove all the navigation properties just for testing, and it works.
来源:https://stackoverflow.com/questions/26071517/web-api-2-odata-4-actions-returning-404