【问题标题】:How do I set the default namespaces in MapHttpRoute?如何在 MapHttpRoute 中设置默认命名空间?
【发布时间】:2012-03-13 07:00:03
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

我们在 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));

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

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

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

【讨论】:

  • 这很好用,谢谢!您可能必须将r.DataTokens 初始化为新的RouteValueDictionary 以避免NullReferenceException
  • @mac10688 我收到同样的错误 r.DataTokens 是只读的。你是怎么解决这个问题的?
  • @123456789 我试图将 mvc 控制器与 web api 混合使用。在这个街区之后,我认为这不值得。我没修。
  • 啊,刚刚意识到为什么人们会收到 DataTokens 是只读的错误:这是因为有两种类型的“路由”: System.Web.Routing.Route 它们不是只读的,然后System.Web.Http.Routing.Route 它们是只读的。我一直有这个工作的方式是基于普通路由表上的扩展方法,例如 RouteTable.Routes.MapHttpRoute 将映射一个 webapi 路由但返回一个 System.Web.Http.Routing.Route,不知道如何在内部有效,但有效。
【解决方案2】:

该功能目前不存在。

【讨论】:

  • @marcind 这在 MVC4 的 RTM 版本中是否存在?
  • 除了用冲突的名称重命名我的控制器之外,还有什么解决方法吗?我正在尝试从现有的 web api 项目继承控制器,但不更改客户请求的 url。
  • @marcind:正如我所见,当前的 MVC/Web API 5 beta 中仍然不存在此功能。有计划在 MVC/Web API 5 中支持它吗?
【解决方案3】:

虽然目前该功能不存在,但您可以通过实现自己的 IHttpControllerSelector 来做到这一点。

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • “您不需要使用 Web API 设置默认命名空间” - 并非总是如此。当你这样做时,会有一些场景,这就是 op 询问的原因。
    【解决方案5】:

    在 MapHttpRoute Factory 调用之前添加

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

    【讨论】:

    • 我们在谈论 MapHttpRoute
    猜你喜欢
    • 2016-03-13
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    相关资源
    最近更新 更多