How do I set the default namespaces in MapHttpRoute?

后端 未结 5 431
没有蜡笔的小新
没有蜡笔的小新 2020-12-25 10:57

With the standard MapRoute method a can pass a string collection representing the namespaces in which to search for my controller. This seems to have disappeared from MapHtt

相关标签:
5条回答
  • 2020-12-25 11:33

    You don't need to set default namespaces with Web API, it will search for controllers in all namespaces in the referenced assemblies (public types with name ending by 'Controller' which implement IHttpController).

    0 讨论(0)
  • 2020-12-25 11:38

    Before the MapHttpRoute Factory call add

    System.Web.Mvc.ControllerBuilder.Current.DefaultNamespaces.Add("Namespace.Full.Controllers"); 
    
    0 讨论(0)
  • 2020-12-25 11:43

    That feature does not exist currently.

    0 讨论(0)
  • 2020-12-25 11:45

    Although the feature does not exist at this moment, you can however do this by implementing your own IHttpControllerSelector.

    This blog article digs a bit into the details: ASP.NET Web API: Using Namespaces to Version Web APIs

    0 讨论(0)
  • 2020-12-25 11:52

    We had this problem with the Umbraco core so we created our own IHttpControllerSelector, the source code can be found here:

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

    You can also install nuget package WebAPIContrib which contains NamespaceHttpControllerSelector.

    To register this you can do this on app startup:

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

    The implementation is pretty straight forward and only deals with routes that have the "Namespaces" datatoken set which you have to manually set since the MapHttpRoute doesn't support this. Example:

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

    The implementation also only caches controllers found with duplicate names since the underlying default implementation removes duplicates from it's cache.

    0 讨论(0)
提交回复
热议问题