假設我有一個具有一些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應用程序中做到這一點?
假設我有一個具有一些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應用程序中做到這一點?
可以採取幾種方法來禁用註釋中提到的某些操作或路由。
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 }
);
}
}
因爲你說不要使用,因爲工作,我建議第三個選項的量的屬性,因爲路由配置定義了這個單一的地方。如果您希望在將來再次啓用該路線,則必須僅刪除一個路線定義。
謝謝你傑出的答案 – Mabraygas
在代碼中刪除它們? – enkryptor
您可以實施類似'DisableFunctionalityActionFilter'的東西,並將其分配給必須禁用的控制器/區域/操作。 –
只需將控制器名稱更改爲無意義的名稱即可。 – Kadaj