【问题标题】:Prevent WebAPI OData Controllers names clashing?防止 WebAPI OData 控制器名称冲突?
【发布时间】:2013-04-20 15:10:19
【问题描述】:

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

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

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 RouteConfig 是:

    routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

【问题讨论】:

  • 您找到解决方案了吗?我有完全相同的问题。
  • 不幸的是,我不得不求助于使用“O”作为所有 OData 控制器的前缀来唯一地命名它们。

标签: asp.net-web-api odata


【解决方案1】:

很遗憾,WebAPI 不支持“开箱即用”的区域,例如 MVC。您需要替换 DefaultHttpControllerSelector。详情在link

此外,您可以尝试 AttributeRouting.WebApi nuget 包 (http://attributerouting.net)。此功能已包含在 WebAPI 路线图中。

【讨论】:

  • 属性路由是否适用于 OData?我应该如何将它用于我的特定场景?我尝试将[RouteArea("v1")] 添加到我的 OData ProductsController 并更改我的 URL 以包含 v1,但这给了我一个 404。删除 v1 给了我与上面相同的错误消息。我已在我的 OP 中添加了有关配置的详细信息。
  • 好的。如果您更改 modelBuilder.EntitySet&lt;Product&gt;("ODataProducts"); 并将您的控制器更改为 MyProj.Controllers.OData.ODataProductsController 怎么办?
  • 是的,我试过了,但它作弊! ;) 我真的不希望我的网址是/odata/ODataProducts。但是感谢属性路由的链接,因为它看起来非常有用。
  • 我还没有这样做(还),但是替换 DefaultHttpControllerSelector 看起来是当前最好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 2013-11-06
  • 2011-01-08
相关资源
最近更新 更多