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

jwa*_*nga 31 asp.net-mvc-routing asp.net-mvc-4 asp.net-web-api

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

Sha*_*zza 16

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

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

您也可以安装WebAPIContrib包含的nuget包NamespaceHttpControllerSelector.

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

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector),
    new NamespaceHttpControllerSelector(GlobalConfiguration.Configuration));
Run Code Online (Sandbox Code Playgroud)

实现非常简单,只处理具有"Namespaces"数据集的路由,您必须手动设置这些路由,因为MapHttpRoute不支持此操作.例:

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

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

  • 这真的很好,谢谢!您可能必须将`r.DataTokens`初始化为新的`RouteValueDictionary`以避免出现`NullReferenceException`. (4认同)
  • 嗯,刚意识到为什么人们会收到DataTokens为只读的错误:这是因为有两种类型的“路由”:System.Web.Routing.Route不是只读的,然后是System.Web.Http.Routing。它们是只读的路由。我一直使用的方法是基于普通路由表的扩展方法,例如RouteTable.Routes.MapHttpRoute将映射一个webapi路由,但返回System.Web.Http.Routing.Route,不确定如何在内部有效,但是有效。 (2认同)

mar*_*ind 13

该功能目前不存在.

  • 那真不幸.谢谢! (3认同)
  • @marcind是否存在于MVC4的RTM版本中? (3认同)
  • @marcind:正如我所看到的,当前的MVC/Web API 5测试版中仍然不存在此功能.有没有计划在MVC/Web API 5中支持它? (3认同)