假设我有一个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应用程序中执行此操作?
答案 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的问题的更好答案