OData v4 函数总是 returns 404
OData v4 Function always returns 404
正在尝试从 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());
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);
}
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。
所以...我做错了什么?
我通过在我的 web.config 中添加以下行解决了这个问题,在 <system.webServer>
下:
<modules runAllManagedModulesForAllRequests="true">
不过,如果我没记错的话,这可能会导致性能问题。所以这并不理想。欢迎任何更好的解决方案...
我解决了一个类似的问题,在请求的 url.
中添加了一个尾部斜杠
您需要一个名为 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
这是防止 404 未找到错误 与 OData 函数/操作的解决方案。
此解决方案的优势
- 使用末尾没有斜线的 OData URI(示例:http://domain.org/odata/Objects/ObjectService.Action)
- 适用于末尾带有斜线的 OData URI(示例:http://domain.org/odata/Objects/ObjectService.Action/)
- 不会导致任何性能问题。
在您的 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>
Et Voilà :)
正在尝试从 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());
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);
}
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。
所以...我做错了什么?
我通过在我的 web.config 中添加以下行解决了这个问题,在 <system.webServer>
下:
<modules runAllManagedModulesForAllRequests="true">
不过,如果我没记错的话,这可能会导致性能问题。所以这并不理想。欢迎任何更好的解决方案...
我解决了一个类似的问题,在请求的 url.
中添加了一个尾部斜杠您需要一个名为 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
这是防止 404 未找到错误 与 OData 函数/操作的解决方案。
此解决方案的优势
- 使用末尾没有斜线的 OData URI(示例:http://domain.org/odata/Objects/ObjectService.Action)
- 适用于末尾带有斜线的 OData URI(示例:http://domain.org/odata/Objects/ObjectService.Action/)
- 不会导致任何性能问题。
在您的 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>
Et Voilà :)