32

使用标准 MapRoute 方法,a 可以传递一个字符串集合,该集合表示要在其中搜索我的控制器的命名空间。这似乎已经从 MapHttpRoute 中消失了。如何使用新的 API 路由定义默认命名空间?

4

5 回答 5

18

我们在 Umbraco 核心中遇到了这个问题,所以我们创建了自己的 IHttpControllerSelector,源代码可以在这里找到:

https://github.com/WebApiContrib/WebAPIContrib/blob/master/src/WebApiContrib/Selectors/NamespaceHttpControllerSelector.cs

您还可以安装WebAPIContrib包含NamespaceHttpControllerSelector.

要注册它,您可以在应用启动时执行此操作:

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector),
    new NamespaceHttpControllerSelector(GlobalConfiguration.Configuration));

该实现非常简单,仅处理具有“命名空间”数据令牌集的路由,您必须手动设置这些路由,因为 MapHttpRoute 不支持这一点。例子:

var r = routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
r.DataTokens["Namespaces"] = new string[] {"Foo"};

该实现还仅缓存发现具有重复名称的控制器,因为底层默认实现会从其缓存中删除重复项。

于 2014-06-27T03:46:06.153 回答
13

该功能目前不存在。

于 2012-02-22T22:10:51.017 回答
2

尽管此时该功能不存在,但是您可以通过实现自己的 IHttpControllerSelector 来做到这一点。

这篇博客文章深入探讨了一些细节:ASP.NET Web API:使用命名空间对 Web API 进行版本控制

于 2013-07-12T09:08:40.883 回答
0

您不需要使用 Web API 设置默认命名空间,它会在引用的程序集中的所有命名空间中搜索控制器(名称以“Controller”结尾的公共类型,它实现了 IHttpController)。

于 2012-08-24T22:50:44.423 回答
-3

在 MapHttpRoute Factory 调用之前添加

System.Web.Mvc.ControllerBuilder.Current.DefaultNamespaces.Add("Namespace.Full.Controllers"); 
于 2013-03-26T21:33:41.907 回答