Tro*_*unt 15 c# http asp.net-web-api
我在各种控制器上使用AuthorizeAttribute,可能需要根据请求本身的某些属性返回403或429(请求太多).我完全在一个自定义的OnAuthorization实现中实现它,然后在必要时抛出一个带有相应响应代码的新HttpResponseException.在我的机器上工作得很好......
在规模上(每分钟数千个请求),这个实现很糟糕,它崩溃了网站.将相同的逻辑移动到控制器操作本身并且仅返回适当的HttpResponseMessage就perf而言工作得非常好,因此在OnAuthorization中抛出异常的费用似乎是perf问题的根本原因.
我喜欢在我可以用来装饰多个控制器和动作的属性中实现它的想法,我强烈不喜欢将少量逻辑移动到控制器动作中,然后重复多次.是否可以从注释返回适当的HTTP状态而不抛出异常?即使它不是从AuthorizeAttribute继承,以这种方式装饰代码也会更好.
编辑:这是Web API 2,而不是MVC
Dav*_*idG 17
正如您所发现的,抛出异常是昂贵的.这种情况下的技巧是覆盖属性中的响应.由于MVC和WebAPI不同(至少在MVC6之前),因此有两种不同的方法.
设置AuthorizationContext.Result允许您有效地覆盖正在执行的操作.设置此值将阻止其附加的操作完全运行:
public override void OnAuthorization(AuthorizationContext filterContext)
{
if(Throw403)
{
filterContext.Result = new HttpStatusCodeResult(403);
}
}
Run Code Online (Sandbox Code Playgroud)
非常相似但你必须设置HttpActionContext.Response属性.一个方便的功能是,您可以获得enumHTTP状态代码:
public override void OnAuthorization(HttpActionContext actionContext)
{
if(Throw403)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3931 次 |
| 最近记录: |