c# - 手动注册 WebApi Controller

标签 c# asp.net-web-api2

我想在自托管 WebApi 时禁用自动发现 Controller ,并在运行时手动指定 Controller 并将它们与路由相关联。

Filip W 在 customising controller discovery 上写了一篇不错的文章这让我相信我可以简单地实现 IHttpControllerTypeResolverIAssembliesResolver 来操纵自动发现什么都不做,但这只解决了一半的问题,感觉很糟糕它解决了一半问题的解决方案——我想有效地禁用发现;但这感觉更像是屠杀发现但保留它......?

一旦发现被禁用,我想通过指定一个 Controller (或 Controller 工厂?)来补偿,这将在服务器初始化之前确定。我可以使用 IHttpControllerSelector 处理路由方面,但是我看不出我应该如何指定一个 Controller ,以便 WebApi 知道它才能工作。

总而言之,我想:

  • 禁用 Controller 发现
  • 明确指定 Controller (实例、类型或工厂)

实现此目标的最合适方法是什么(如果有)?

我不受任何特定版本的约束;目前使用 .Net Framework 4.7.2 和 Microsoft.AspNet.WebApi.OwinSelfHost 5.2.6。

最佳答案

我认为 HttpControllerSelector 是执行此操作的正确方法。 这是一个小例子:

HttpControllerSelector:

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;
    }
}

WebApi配置:

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 中,您可以做任何您想做的事情。作为一个简单的例子,有一个总是被选中的 Controller 。此时你可以使用工厂或适合你的东西。

要禁用正常发现,您必须覆盖 WebApiConfig 中显示的正常选择器。

希望这让您知道如何去做,编码愉快!

关于c# - 手动注册 WebApi Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52591130/

相关文章:

c# - 使用导航属性发布新实体

azure - 如何调试 B2C 权限不足的 Azure 应用程序?

entity-framework - Entity Framework 将 "1"附加到表名并且查询失败

c# - 如何检查是否可以在 C# 中使用另一个字符串的字符获取一个字符串?

c# - 如何在 C# 中为泛型类型创建实例

c# - 原始数组是否需要整数作为索引

c# - ASP.NET mvc4 DropDownListFor 传回一个对象

c# - 在 Visual Studio 中调试 WebApi 不返回对 MVC 应用程序的响应

c# - 从 ASP.NET 操作返回文件时出现 ERR_SPDY_PROTOCOL_ERROR

c# - 在 MVC 中填充下拉列表