我对ActionResult何时实际得到评估感到有点困惑。
使用Authorize属性时,我可以看到,如果用户未获得授权,结果上下文将被设置为未经授权的结果:
filterContext.Result = new HttpUnauthorizedResult();
但是,AuthorizeAttribute不执行重定向,而是简单地设置仅通过.NET管道“流动”的上下文,直到某些内容将其转换为401标头。
我的问题是.Net实际上是什么转换?
答案 0 :(得分:2)
在 IResultFilter.OnResultExecuting 之后 IResultFilter.OnResultExecuted 之前我对ActionResult何时实际得到评估感到有点困惑。
ActionResult 得到评估(未刷新到HTTP响应或客户端)
现在您使用Authorize属性演示的是Action过滤器,它使开发人员能够在Action Filter生命周期内更改/更改操作结果。如果用户未经过身份验证,则在“授权”属性中,正在将操作结果更改为HttpUnauthorizedResult。现在你在说什么
将某些内容转换为401标题
但实际上它是HttpUnauthorizedResult,它在实例化ActionResult对象时设置响应头401。一旦ActionResult被实例化,它将被刷新到HTTP响应管道。
答案 1 :(得分:1)
经过一番挖掘,我发现所有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);