2016-08-17 55 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

相关问题