如何禁用ASP.NET应用程序的某些API

Mab*_*gas 1 c# asp.net api

假设我有一个具有一些API的ASP.NET应用程序。

例如,

{HostName}/api/a/*      
{HostName}/api/b/*
Run Code Online (Sandbox Code Playgroud)

现在,我想禁用所有{HostName}/api/a/*API(但保持/api/b/*)。客户端调用/api/a/*API时,它们会收到404错误。当客户端调用/api/b/*API时,响应正常。

在c#ASP.NET应用程序中有什么方法可以做到这一点?

Ral*_*ing 7

如注释中所述,可以采取几种方法来禁用某些操作或路由。

1.)[NoAction]属性

[NoAction]来自的属性System.Web.Http可以应用于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...
}
Run Code Online (Sandbox Code Playgroud)

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 }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

因为您说由于工作量原因不使用属性,所以我建议使用第三个选项,因为路由配置为此定义了一个位置。而且,如果您希望将来再次启用该路由,则只需删除一个路由定义。