6

试图从OData v3移动到OData v4。为什么我在尝试使用OData Functions时总是收到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());

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);
}

从 $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>
    ...

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

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

我还尝试了以下方法:

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')

以上所有结果都会导致404

所以......我在这里做错了什么?

4

4 回答 4

13

我解决了一个类似的问题,在请求的 url 中添加了斜杠。

于 2015-09-08T03:24:01.357 回答
7

我通过在我的web.config中添加以下行来解决这个问题<system.webServer>

<modules runAllManagedModulesForAllRequests="true">

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

于 2015-08-18T06:32:38.790 回答
3

您需要一个名为 UrlRoutingModule-4.0 的模块才能通过 IIS 运行。此解决方案使您注册的所有 HTTP 模块在每个请求上运行,而不仅仅是托管请求(例如 .aspx)。这意味着模块将在任何时候运行 .jpg .gif .css .html .pdf 等。

因此,更好的解决方案是在web.config中添加以下内容

<modules>
  <remove name="UrlRoutingModule-4.0" />
  <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>

资料来源:http ://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html

于 2016-06-02T09:09:35.650 回答
2

这是防止OData 功能/操作出现404 Not Found 错误的解决方案。

此解决方案的好处

在您的web.config中添加这些行

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

等等 Voilà :)

于 2016-09-11T16:32:19.750 回答