我对 ActionResult 何时实际得到评估感到有些困惑。
使用 Authorize 属性时,我可以看到如果用户未获得授权,则结果上下文将设置为未经授权的结果:
filterContext.Result = new HttpUnauthorizedResult();
但是,AuthorizeAttribute 不执行重定向,而是简单地设置上下文,该上下文只是“流动”通过 .NET 管道,直到某些东西将其转换为 401 标头。
我的问题是 .Net 中的实际转换是什么?
我对 ActionResult 何时实际得到评估感到有些困惑。
使用 Authorize 属性时,我可以看到如果用户未获得授权,则结果上下文将设置为未经授权的结果:
filterContext.Result = new HttpUnauthorizedResult();
但是,AuthorizeAttribute 不执行重定向,而是简单地设置上下文,该上下文只是“流动”通过 .NET 管道,直到某些东西将其转换为 401 标头。
我的问题是 .Net 中的实际转换是什么?
我对 ActionResult 何时实际得到评估感到有些困惑。
在IResultFilter.OnResultExecuting之后和IResultFilter.OnResultExecuted之前对ActionResult进行评估(不刷新到 HTTP 响应或客户端)
现在,您使用 Authorize 属性演示的是动作过滤器,它使开发人员能够在动作过滤器生命周期内更改/更改动作结果。如果用户未通过身份验证,则在 Authorize 属性中,它将操作结果更改为HttpUnauthorizedResult。现在你在说什么
某些东西将其转换为 401 标头
但实际上是 HttpUnauthorizedResult 在实例化 ActionResult 对象时设置了响应头 401。一旦 ActionResult 被实例化,它将被刷新到 HTTP 响应管道。
经过一番挖掘,我看到所有的 ActionResults 都继承自抽象类 ActionResult,它有一个抽象方法:ExecuteResult
public abstract class ActionResult
{
public abstract void ExecuteResult(ControllerContext context);
}
每个动作结果用自己的逻辑实现的正是这种方法。
例如,JsonResult 需要指定 ContentType:
response.ContentType = "application/json";
FileResult 设置“Content-Disposition”标头:
context.HttpContext.Response.AddHeader("Content-Disposition", headerValue);