加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-web-api2 – 使用未绑定功能时具有多个路由的OData服务

发布时间:2020-12-16 03:24:59 所属栏目:asp.Net 来源:网络整理
导读:有谁知道如何在.NET服务中托管OData v4以使用多个路由? 我有以下内容: config.MapODataServiceRoute("test1","test1",GetEdmModelTest1());config.MapODataServiceRoute("test2","test2",GetEdmModelTest2()); 每个GetEdmModel方法都有映射对象. 我可以按
有谁知道如何在.NET服务中托管OData v4以使用多个路由?

我有以下内容:

config.MapODataServiceRoute("test1","test1",GetEdmModelTest1());
config.MapODataServiceRoute("test2","test2",GetEdmModelTest2());

每个GetEdmModel方法都有映射对象.
我可以按照以下方式访问该服务(这很好):

http://testing.com/test1/objects1()
http://testing.com/test2/objects2()

但是,如果我尝试调用以下函数(将无法工作):

[HttpGet]
[ODataRoute("test1/TestFunction1()")]
public int TestFunction1()
{ return 1; }

它会抛出以下错误:

The path template ‘test1/TestFunction1()’ on the action ‘TestFunction1’ in controller ‘Testing’ is not a valid OData path template. Resource not found for the segment ‘test1’.

然而,如果我删除“test2”的“MapODataServiceRoute”,那么只有一条路线,它一切正常.

如何使用多个路由?

**我已在以下**发布了该问题的完整示例
https://github.com/OData/WebApi/issues/1223

**我已尝试下面列出的OData版本示例,但有以下问题**
https://github.com/OData/ODataSamples/tree/master/WebApi/v4/ODataVersioningSample
我之前尝试过“OData版本”示例,但它没有用.
似乎未绑定(未绑定是目标)不遵循相同的路由规则是正常的服务调用.

防爆.如果您下载“OData版本”示例并执行以下操作.

>在V1 – > WebApiConfig.cs添加
builder.Function(nameof(Controller.ProductsV1Controller.Test))返回<串GT;();
>在V2中 – > WebApiConfig.cs添加
?builder.Function(nameof(Controller.ProductsV2Controller.Test))返回<串GT;();
>在V1 – > ProductsV1Controller.cs添加
[HTTPGET]
[ODataRoute( “测试()”)]
public string Test()
{return“V1_Test”; }
>在V2中 – > ProductsV2Controller.cs添加
[HTTPGET]
[ODataRoute( “测试()”)]
public string Test()
{return“V2_Test”; }

现在打电话给它. “/ versionbyroute / v1 / Test()”你会得到“V2_Test”

问题是“GetControllerName”在使用未绑定的函数/操作时不知道如何获取控制器.
这就是我尝试“推断”控制器时发现的大多数示例代码失败的原因.

解决方法

看看 OData Versioning Sample的底漆.

The key point of trouble is usually that the DefaultHttpControllerSelector maps controllers by local name,not fullname/namespace.

如果您的实体类型和控制器名称在两个EdmModels中都是唯一的,那么您不需要做任何特殊的事情,它应该只是开箱即用.上面的示例利用了这个概念,强制您将字符串值注入控制器类的物理名称以使它们唯一,然后在ODataVersionControllerSelector中重写GetControllerName以将传入路由映射到自定义控制器名称

如果控制器的唯一名称看起来很难,并且您希望使用完整的命名空间(意味着您的控制器名称逻辑仍然是标准的),那么您当然可以在重写DefaultHttpControllerSelector时实现自己的逻辑来选择特定的控制器类实例.简单地重写SelectController.这个方法需要返回一个HttpControllerDescriptor的实例,它比样本更复杂一些.

为了向您展示我的意思,我会将解决方案发布到旧项目的要求中,这与您的项目略有不同.我有一个WebAPI项目来管理对多个数据库的访问,这些数据库具有类似的模式,许多实体名称是相同的,这意味着这些控制器类将具有相同的名称.控制器由文件夹/命名空间构成,这样就有一个名为DB的根文件夹,然后每个数据库都有一个文件夹,然后控制器就在那里.

enter image description here

You can see that this project has many different schemas,they effectively map to versions of an evolving solution,the non-DB namespaces in this image are a mix of OData v4,v3 and standard REST apis. It is possible to get all these beasts to co-exist

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读