0

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

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

filterContext.Result = new HttpUnauthorizedResult();

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

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

4

2 回答 2

2

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

在IResultFilter.OnResultExecuting之后和IResultFilter.OnResultExecuted之前对ActionResult进行评估(不刷新到 HTTP 响应或客户端)

现在,您使用 Authorize 属性演示的是动作过滤器,它使开发人员能够在动作过滤器生命周期内更改/更改动作结果。如果用户未通过身份验证,则在 Authorize 属性中,它将操作结果更改HttpUnauthorizedResult。现在你在说什么

某些东西将其转换为 401 标头

但实际上是 HttpUnauthorizedResult 在实例化 ActionResult 对象时设置了响应头 401。一旦 ActionResult 被实例化,它将被刷新到 HTTP 响应管道。

于 2013-03-19T07:49:45.513 回答
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);
于 2013-03-18T23:35:06.643 回答