如何在重写的OnActionExecuting方法中读取context.Result的状态码?
能否在OnActionExecuting中读取context.Result的状态码?
当然可以读取context.Result的状态值来做判断,但这里有个关键细节得提一下——在OnActionExecuting这个生命周期阶段,默认情况下context.Result是null,因为这个过滤器是在控制器方法执行前触发的,还没到生成响应结果的环节。
那什么时候context.Result会有值呢?比如如果有更早执行的过滤器(比如ASP.NET Core自带的授权过滤器)已经提前设置了响应结果(比如返回401的UnauthorizedResult),这时候你就能在OnActionExecuting里读取到它。
给你调整后的代码示例,两种判断方式都能用:
public override void OnActionExecuting(ActionExecutingContext context) { base.OnActionExecuting(context); // 方式1:直接判断特定的Result类型(推荐,更精准) if (context.Result is UnauthorizedResult) { // 执行401对应的逻辑 // 比如记录日志、返回自定义提示等 } // 方式2:判断状态码(适用于自定义StatusCodeResult的场景) else if (context.Result is StatusCodeResult statusCodeResult && statusCodeResult.StatusCode == StatusCodes.Status401Unauthorized) { // 同样处理401逻辑 } else { // 请求未被拦截,执行你的校验操作或其他逻辑 } }
额外提醒两点:
- 如果你的校验逻辑需要依赖授权结果,记得调整过滤器的执行顺序(通过设置
[Filter]的Order属性),让这个过滤器在授权过滤器之后运行,这样才能确保拿到授权阶段设置的Result。 - 优先用
UnauthorizedResult类型判断会更可靠,因为有些自定义的结果可能也返回401状态码,但类型不是UnauthorizedResult,根据类型判断能避免误判。
内容的提问来源于stack exchange,提问作者Santa Cloud
相关产品推荐
相关产品推荐

