如何在MapHttpRoute中设置默认命名空间?

时间:2012-02-22 21:37:12

标签: asp.net-mvc-routing asp.net-mvc-4 asp.net-web-api

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

5 个答案:

答案 0 :(得分:16)

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

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

您还可以安装包含NamespaceHttpControllerSelector的nuget包WebAPIContrib

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

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

实施非常简单,只处理具有"命名空间"的路由。您必须手动设置的datatoken集,因为MapHttpRoute不支持此操作。例如:

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

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

答案 1 :(得分:13)

目前不存在该功能。

答案 2 :(得分:2)

虽然此时此功能不存在,但 可以通过实现自己的IHttpControllerSelector来实现。

这篇博客文章深入探讨了细节:ASP.NET Web API: Using Namespaces to Version Web APIs

答案 3 :(得分:0)

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

答案 4 :(得分:-3)

在MapHttpRoute工厂调用之前添加

System.Web.Mvc.ControllerBuilder.Current.DefaultNamespaces.Add("Namespace.Full.Controllers");