Asp.net-Web-Api

在執行時禁用 ApiController

  • November 11, 2016

我有一個 ASP.NET Web API (.NET 4) 應用程序,它有幾個控制器。我們將在 IIS 上執行幾個 Web API 應用程序實例,但有一點不同。在某些 IIS 實例下,只有某些控制器可用。我在想的是在實例啟動時禁用/解除安裝不適用於實例的控制器。

任何人都可以獲得一些可以指導我正確方向的資訊嗎?

您可以通過裝飾 DefaultHttpControllerActivator 來放入您自己的自定義IHttpControllerActivator。在裡面只檢查一個設置,如果允許,只創建控制器。

當您從 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);

   }
}   

您可以像這樣切換啟動器:

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new YourCustomControllerActivator());

更新

自從我查看這個問題以來已經有一段時間了,但是如果我今天要解決它,我會稍微改變方法並使用 custom IHttpControllerSelector。這在啟動器之前呼叫,並為啟用和禁用控制器提供了一個更有效的位置……(儘管其他方法確實有效)。您應該能夠裝飾或繼承自DefaultHttpControllerSelector.

引用自:https://stackoverflow.com/questions/13484826