2016-08-17 51 views
0

假設我有一個具有一些API的ASP.NET應用程序。如何禁用ASP.NET應用程序的某些API

例如,

{HostName}/api/a/*  
{HostName}/api/b/* 

現在我想禁用所有{HostName}/api/a/*的API(但仍/api/b/*)。當客戶端調用/api/a/* API時,他們會收到404錯誤。當客戶端調用/api/b/* API時,響應正常。

有沒有辦法在c#ASP.NET應用程序中做到這一點?

+2

在代碼中刪除它們? – enkryptor

+0

您可以實施類似'DisableFunctionalityActionFilter'的東西,並將其分配給必須禁用的控制器/區域/操作。 –

+0

只需將控制器名稱更改爲無意義的名稱即可。 – Kadaj

回答

3

可以採取幾種方法來禁用註釋中提到的某些操作或路由。

1)[NoAction]屬性

System.Web.Http[NoAction]屬性可以應用於ApiController動作。如果調用這樣的方法,服務器將返回HTTP代碼405(方法不允許)。該屬性只能應用於方法級別,而不能應用於類。所以每一個方法都必須用這個屬性來修飾。

2)編寫自定義行爲過濾

這種方法給你更多的控制權。您的過濾器可以在類級別應用,可以實現一些更高級的邏輯在什麼條件控制器是訪問或沒有(取決於日期,許可證,功能切換等)

public class MyNoActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    {    
     if (IfDisabledLogic(actionContext)) 
     { 
      actionContext.Response = new HttpResponseMessage(HttpStatusCode.NotFound); 
     } 
     else     
      base.OnActionExecuting(actionContext); 
    } 
} 

[MyNoActionFilter] 
public class ValuesController : ApiController 
{ 
    // web api controller logic... 
} 

3)路線在WebApiConfig.cs中配置

您可以爲WebApiConfig中無法訪問的控制器添加Web API路由,並將此路由映射到不存在的控制器。然後,框架採用此路由,沒有找到控制器並向客戶端發送404返回碼。爲了避免不必要的執行,在開始時放置這些路由非常重要。

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     config.Routes.MapHttpRoute(
      name: "DisabledApi", 
      routeTemplate: "api/b/{id}", 
      defaults: new { controller = "DoesNotExist", id = RouteParameter.Optional } 
     ); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

因爲你說不要使用,因爲工作,我建議第三個選項的量的屬性,因爲路由配置定義了這個單一的地方。如果您希望在將來再次啓用該路線,則必須僅刪除一個路線定義。

+0

謝謝你傑出的答案 – Mabraygas

相關問題