WebAPI 2.2 中没有命名空间的 OData v4 自定义函数

Posted

技术标签:

【中文标题】WebAPI 2.2 中没有命名空间的 OData v4 自定义函数【英文标题】:OData v4 Custom functions without namespace in WebAPI 2.2 【发布时间】:2015-08-13 14:34:57 【问题描述】:

我们想在 WebAPI 2.2 上为我们的新项目使用 ODataV4,但有一个问题:url 设计。 我们必须通过我们的 api 传递 json 数据和二进制数据(图像)。

是否有可能避免 OData 路由上自定义函数的命名空间外观? /odata/Customers/GetByName('Name') 而不是 /odata/Customers/CustomerService.GetByName('Name')

以及如何使用 OData 控制器实现对二进制数据(jpeg 图像)的响应? 一种非常丑陋的方法是将 OdataControllers 和 ApiControllers 托管在一个项目中并使用不同的 url 区域。

/odata/Customers(1) -> OdataControllers /api/Customers/1/ProfileImage -> ApiController

【问题讨论】:

【参考方案1】:

第一个问题请咨询http://odata.github.io/WebApi/#06-01-custom-url-parsing。

【讨论】:

谢谢。看起来不错。但我总是得到回复 "error": "code":"","message":"No HTTP resource was found that matches the request URI 'http://testapp.localhost/v1/Parts(432)/Rate'.","innererror": "message":"No routing convention was found to select an action for the OData path with template '~/entityset/key/unresolved'.","type":"","stacktrace":"" 好的。我已将 public async Task<HttpResponseMessage> Rate([FromODataUri] long key) 更改为 public async Task<HttpResponseMessage> Rate() 然后它工作。但是如何引用 Parts Key 呢?【参考方案2】:

谢谢你,千里!你真的帮了大忙!

HttpConfiguration config = …
config.EnableCaseInsensitive(caseInsensitive: true);
config.EnableUnqualifiedNameCall(unqualifiedNameCall: true);
config.EnableEnumPrefixFree(enumPrefixFree: true);
config.MapODataServiceRoute("odata", "odata", edmModel);

【讨论】:

以上是关于WebAPI 2.2 中没有命名空间的 OData v4 自定义函数的主要内容,如果未能解决你的问题,请参考以下文章

带有 odata 和 $expand 的 Web Api 2.2

使用 Asp.Net WebApi + EF + Odata 深度插入数据

如何在不指定完整命名空间的情况下使用 OData(7.4) .Net Core 过滤枚举列表?

WebAPI 2.2 不支持 substringof 函数

OData 和 WebAPI:模型上不存在导航属性

OData WebAPI 2 复杂授权