OData v4函数始终返回404

Mat*_*att 6 c# odata asp.net-web-api asp.net-web-api2 odata-v4

试图从OData v3迁移到OData v4.为什么我在尝试使用OData函数时会继续获得404

Web API配置:

ODataModelBuilder builder = new ODataConventionModelBuilder();
//etc
builder.EntitySet<LocalizableString>("LocalizableStringApi");
//etc
var getComparitiveTableFunction = builder.EntityType<LocalizableString>().Collection.Function("GetComparitiveTable");
getComparitiveTableFunction.Parameter<string>("cultureCode");
getComparitiveTableFunction.ReturnsCollection<ComparitiveLocalizableString>();
//etc
config.MapODataServiceRoute("OData_Kore_CMS", "odata/kore/cms", builder.GetEdmModel());
Run Code Online (Sandbox Code Playgroud)

C#代码:

[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
[HttpGet]
//[ODataRoute("Default.GetComparitiveTable(cultureCode={cultureCode})")] // Tried this, but gets errors and I noticed the function is in the OData model anyway without this, so should be fine.
public virtual IHttpActionResult GetComparitiveTable([FromODataUri] string cultureCode)
{
    // Implementation
    return Ok(query);
}
Run Code Online (Sandbox Code Playgroud)

从$ metadata返回的XML:

<Schema Namespace="Default">
    <Function Name="GetComparitiveTable" IsBound="true">
        <Parameter Name="bindingParameter" Type="Collection(Kore.Localization.Domain.LocalizableString)"/>
        <Parameter Name="cultureCode" Type="Edm.String" Unicode="false"/>
        <ReturnType Type="Collection(Kore.Localization.Models.ComparitiveLocalizableString)"/>
    </Function>
    ...
Run Code Online (Sandbox Code Playgroud)

如您所见,它位于架构/ OData模型中......但以下查询不起作用:

http://localhost:30863/odata/kore/cms/LocalizableStringApi/Default.GetComparitiveTable(cultureCode='en-US')
Run Code Online (Sandbox Code Playgroud)

我也尝试过以下方法:

http://localhost:30863/odata/kore/cms/LocalizableStringApi/GetComparitiveTable(cultureCode='en-US')
http://localhost:30863/odata/kore/cms/Default.GetComparitiveTable(cultureCode='en-US')
http://localhost:30863/odata/kore/cms/GetComparitiveTable(cultureCode='en-US')
Run Code Online (Sandbox Code Playgroud)

所有上述结果都是404.

那么......我在这里做错了什么?

小智 13

我解决了向请求的URL添加尾部斜杠的类似问题.


Mat*_*att 5

我解决了这个加在我的下面一行web.config中,下<system.webServer>:

<modules runAllManagedModulesForAllRequests="true">
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,这可能会导致性能问题.所以这不太理想.任何更好的解决方案都非常受欢

  • 这是真的,这是一个性能问题(并且是潜在的意外错误来源).请参阅我的答案以获得替代解决方案. (2认同)