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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With