我有一个AuthorizationHandler
,我想现在返回一个自定义的状态代码(或文本),我只是想让它返回429 (这是利率限制,但这是不相关的)
public class ReCaptchaHandler : AuthorizationHandler<ReCaptchaRequirement>
{
private readonly ReCaptcha _reCaptcha;
private readonly IHttpContextAccessor _accessor;
public ReCaptchaHandler(ReCaptcha reCaptcha, IHttpContextAccessor accessor)
{
_reCaptcha = reCaptcha;
_accessor = accessor;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
ReCaptchaRequirement requirement)
{
context.Fail();
_accessor.HttpContext.Response.StatusCode = 429;
return Task.CompletedTask;
}
}
public class ReCaptchaRequirement : IAuthorizationRequirement
{
}
如您所见,我正在尝试使用_accessor.HttpContext.Response.StatusCode = 429;
设置状态= 429
我尝试使用来自var filterContext = context.Resource as AuthorizationFilterContext;
的http上下文,然后使用filterContext.HttpContext
我创建的策略如下
services.AddSingleton<IAuthorizationHandler, ReCaptchaHandler>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddAuthorization(options =>
{
options.AddPolicy("ReCaptcha",
policy => policy.Requirements.Add(new ReCaptchaRequirement()));
});
代码运行并保护标记为[Authorize(Policy = "ReCaptcha")]
的路由,但除非我抛出异常,否则状态始终为400。
发布于 2017-05-23 14:19:41
如果按以下方式设置StatusCode
,它就会工作
context.Fail();
var Response = filterContext.HttpContext.Response;
var message= Encoding.UTF8.GetBytes("ReCaptcha failed");
Response.OnStarting(async () =>
{
filterContext.HttpContext.Response.StatusCode = 429;
await Response.Body.WriteAsync(message, 0, message.Length);
});
发布于 2017-05-23 13:23:57
假设您想要覆盖API调用的异常代码,如果是这样的话,您是否尝试向MVC配置筛选器中添加一个新的异常筛选器,然后在异常上重写状态代码,如下所示。
Startup.cs
services.AddMvc(options =>
{
options.Filters.Add(typeof(someExceptionFilter));
})
public class someExceptionFilter: IExceptionFilter
{
public someExceptionFilter()
{
}
public void OnException(ExceptionContext context)
{
var exceptionType = context.Exception.GetType();
if (exceptionType == typeof(yourException))
{
context.ExceptionHandled = true;
var response = context.HttpContext.Response;
response.StatusCode = 429;
response.ContentType = "application/json";
//response.WriteAsync(context.Exception.Message);
context.Result = new JsonResult(context.Exception.Message);
}
}
}
https://stackoverflow.com/questions/44135817
复制相似问题