在运行时禁用ApiController

Car*_*ark 8 asp.net-web-api

我有一个ASP.NET Web API(.NET 4)应用程序,它有几个控制器.我们将在IIS上运行Web API应用程序的多个实例,但有一点不同.某些IIS实例下只能使用某些控制器.我想的是在实例启动时禁用/卸载不适用于实例的控制器.

任何人都有一些信息可以指导我正确的方向吗?

Mar*_*nes 5

您可以IHttpControllerActivator通过装饰 DefaultHttpControllerActivator来放置您自己的自定义。在里面只检查一个设置,如果允许的话只创建控制器。

当您从 Create 方法返回 null 时,用户将收到 404 Not Found 消息。

我的示例显示正在检查应用程序设置(App.Config 或 Web.Config)中的一个值,但显然这可以是任何其他环境感知条件。

public class YourCustomControllerActivator : IHttpControllerActivator
{
    private readonly IHttpControllerActivator _default = new DefaultHttpControllerActivator();

    public YourCustomControllerActivator()
    {

    }

    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor,
                                  Type controllerType)
    {
        if (ConfigurationManager.AppSettings["MySetting"] == "Off")
        {
            //Or get clever and look for attributes on the controller in controllerDescriptor.GetCustomAttributes<>(); 
            //Or use the contoller name controllerDescriptor.ControllerName
            //This example uses the type
            if (controllerType == typeof (MyController) ||
                controllerType == typeof (EtcController))
            {
                return null;
            }
        }
        return _default.Create(request, controllerDescriptor, controllerType);

    }
}   
Run Code Online (Sandbox Code Playgroud)

您可以像这样切换激活器:

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

更新

我已经有一段时间没有看到这个问题了,但是如果我今天要解决它,我会稍微改变方法并使用自定义IHttpControllerSelector. 这在激活器之前被调用,并为启用和禁用控制器提供了一个稍微更有效的地方......(尽管另一种方法确实有效)。您应该能够装饰或继承DefaultHttpControllerSelector.