代码之家  ›  专栏  ›  技术社区  ›  Élie

手动注册WebApi控制器

  •  2
  • Élie  · 技术社区  · 7 年前

    菲利普W写了一篇很好的文章 customising controller discovery IHttpControllerTypeResolver IAssembliesResolver 操纵自动发现而不采取任何行动,但这只解决了一半的问题,而且对于它解决的一半问题来说,这感觉是一个糟糕的解决方案——我想有效地禁用发现;但这感觉更像是屠宰发现,但保持它在附近。。。?

    IHttpControllerSelector 然而,我不明白我应该如何指定一个控制器,这样WebApi就知道它是如何工作的。

    总之,我想:

    • 显式指定控制器(实例、类型或工厂)

    实现这一点最合适的方法是什么(如果有的话)?

    我不受任何特定版本的束缚;当前使用.Net framework 4.7.2和 Microsoft.AspNet.WebApi.OwinSelfHost 5.2.6.

    1 回复  |  直到 7 年前
        1
  •  2
  •   P. Grote    7 年前

    我认为HttpControllerSelector是正确的方法。

    Http控制器选择器:

    public class HttpControllerSelector : IHttpControllerSelector
    {
        private readonly HttpConfiguration _httpConfiguration;
    
        public HttpControllerSelector(HttpConfiguration httpConfiguration)
        {
            this._httpConfiguration = httpConfiguration;
        }
    
        public HttpControllerDescriptor SelectController(HttpRequestMessage request)
        {
            return new HttpControllerDescriptor(this._httpConfiguration, 
                                                nameof(ValuesController), 
                                                typeof(ValuesController));
        }
    
        public IDictionary<string, HttpControllerDescriptor> GetControllerMapping()
        {
            var mapping = new Dictionary<string, HttpControllerDescriptor>
            {
                {
                    nameof(ValuesController),
                    new HttpControllerDescriptor(this._httpConfiguration,
                                                 nameof(ValuesController),
                                                 typeof(ValuesController))
                }
            };
            return mapping;
        }
    }
    

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            config.Services.Replace(typeof(IHttpControllerSelector), new HttpControllerSelector(config));
    
            // Web API routes
            config.MapHttpAttributeRoutes();
    
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
    

    因此,在HttpControllerSelector中,您可以做任何您想做的事情。举个简单的例子,这里有一个控制器,它总是被选中的。在这一点上,你可以使用一个工厂或适合你的东西。

    希望这能给你一个想法怎么做,快乐编码!

    推荐文章