ActionResult什么时候被评估?

时间:2013-03-18 22:48:40

标签: asp.net-mvc actionresult

我对ActionResult何时实际得到评估感到有点困惑。

使用Authorize属性时,我可以看到,如果用户未获得授权,结果上下文将被设置为未经授权的结果:

filterContext.Result = new HttpUnauthorizedResult();

但是,AuthorizeAttribute不执行重定向,而是简单地设置仅通过.NET管道“流动”的上下文,直到某些内容将其转换为401标头。

我的问题是.Net实际上是什么转换?

2 个答案:

答案 0 :(得分:2)

  

我对ActionResult何时实际得到评估感到有点困惑。

IResultFilter.OnResultExecuting 之后 IResultFilter.OnResultExecuted

之前

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);