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

时间:2016-08-17 08:25:09

标签: c# asp.net api

假设我有一个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应用程序中执行此操作?

3 个答案:

答案 0 :(得分:7)

如评论中所述,有几种方法可以禁用某些操作或路由。

1。)[NoAction]属性

来自[NoAction]的{​​{1}}属性可以应用于ApiController操作。如果调用此方法,则服务器返回HTTP代码405(不允许方法)。该属性只能应用于方法级别而不能应用于类。因此,每个方法都必须使用此属性进行修饰。

2.)编写自定义操作过滤器

这种方法可以让您获得更多控制权。您的过滤器可以在类级别上应用,您可以实现一些更高级的逻辑,在这些逻辑中控制器是否可访问(取决于日期,许可证,功能切换等)

System.Web.Http

3.。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... }

中的路线配置

您可以为WebApiConfig中的无法访问的控制器添加Web api路由,并将此路由映射到不存在的控制器。然后框架采用此路由,找不到控制器并向客户端发送404返回代码。将这些路线放在开头是很重要的,以避免意外执行。

WebApiConfig.cs

因为你建议使用第三个选项,因为工作量没有使用属性,因为路由配置为此定义了一个地方。如果您想再次启用该路由,则必须仅删除一个路由定义。

答案 1 :(得分:1)

可能是一个黑客,但对我来说很好:

将控制器的范围从 public 更改为 internal 会隐藏该控制器类的所有操作。所以:

internal class AController : ApiController
{
  [...]
}

对 http://host/api/a/* 的请求将失败 “找不到与名为'a'的控制器匹配的类型。”

答案 2 :(得分:0)

为了获得更好的曝光率-我遇到了同样的问题,我认为Amit Kumar Ghosh's的使用NonAction属性是RalfBönning的问题的更好答案