可以采取多种方法来禁用 cmets 中提到的某些操作或路由。
1.) [NonAction] 属性
System.Web.Http 中的 [NonAction] 属性可应用于 ApiController 操作。如果调用了这样的方法,则服务器返回 HTTP 代码 404(未找到方法)。该属性只能应用于方法级别,而不能应用于类。所以每一个方法都必须用这个属性装饰。
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 }
);
}
}
因为您声明由于工作量大而不要使用属性,所以我推荐第三个选项,因为路由配置为此定义了一个地方。如果您想在将来再次启用该路由,您只需删除一个路由定义。