Asp.net web api 防止WebAPI OData控制器名称冲突?

Asp.net web api 防止WebAPI OData控制器名称冲突?,asp.net-web-api,odata,Asp.net Web Api,Odata,我有一个在Azure中托管的WebAPI项目,它为移动应用程序提供JSON web服务。现在我想添加一个OData服务,为业务用户提供数据。在一个Web角色中托管两个独立的WebAPI项目看起来很困难,因此我尝试在一个项目中运行这两个服务 我遇到的问题是,两个模型类都使用相同的模型类,因此它们都需要相同的控制器类名,例如ProductsController。如果尝试将控制器放入不同的名称空间,则会出现错误: Multiple types were found that match the con

我有一个在Azure中托管的WebAPI项目,它为移动应用程序提供JSON web服务。现在我想添加一个OData服务,为业务用户提供数据。在一个Web角色中托管两个独立的WebAPI项目看起来很困难,因此我尝试在一个项目中运行这两个服务

我遇到的问题是,两个模型类都使用相同的模型类,因此它们都需要相同的控制器类名,例如ProductsController。如果尝试将控制器放入不同的名称空间,则会出现错误:

Multiple types were found that match the controller named 'Products'.
This can happen if the route that services this request ('odata/{*odataPath}')
found multiple controllers defined with the same name but differing namespaces,
which is not supported. The request for 'Products' has found the following
matching controllers: 
MyProj.Controllers.OData.ProductsController
MyProj.Controllers.ProductsController
由于无法在MapODataRoute中指定名称空间,因此无法消除这两个控制器的歧义。有人能提出解决办法吗

更新1

有关配置的一些详细信息。OData配置为:

        config.EnableQuerySupport();

        ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
        modelBuilder.EntitySet<Product>("Products");

        Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();
        config.Routes.MapODataRoute("ODataRoute", "odata", model);

不幸的是,WebAPI不支持“开箱即用”的领域,比如MVC。您需要更换
DefaultHttpControllerSelector
。详情见附件


此外,您还可以尝试使用AttributeRouting.WebApi nuget包()。此功能已包含在WebAPI路线图中。

属性路由是否适用于OData?我应该如何在我的特定场景中使用它?我尝试将
[RouteArea(“v1”)]
添加到我的OData产品控制器中,并将我的URL更改为包含v1,但这给了我一个404。删除v1会给我与上面相同的错误消息。我已经在OP.OK中添加了配置的详细信息。如果更改
modelBuilder.EntitySet(“ODataProducts”)
并将您的控制器更改为
MyProj.Controllers.OData.ODataProductsController
?是的,我试过了,但它作弊了!)我真的不希望我的URL是
/odata/ODataProducts
。但是,感谢您提供了指向attributerouting的链接,因为它看起来非常有用。我还没有这样做,但是替换
DefaultHttpControllerSelector
看起来是当前最好的解决方案。您找到解决方案了吗?我也有同样的问题。不幸的是,我不得不使用“O”作为所有OData控制器的前缀来唯一命名它们。
    routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );