2013-03-18 78 views
0

我對ActionResult實際得到評估的時間有點困惑。ActionResult何時被評估?

當使用授權屬性,我可以看到,如果用戶沒有被授權,結果上下文被設置爲未經授權的結果:

filterContext.Result = new HttpUnauthorizedResult(); 

然而,AuthorizeAttribute沒有做重定向,相反,它只是簡單地設置通過.NET管道「流動」的上下文,直到將其轉換爲401頭部爲止。

我的問題是什麼在.Net實際上做轉換?

回答

2

我有點困惑,當ActionResult實際上被評估。

的ActionResult 得到評估(不刷新到HTTP響應或客戶端)後IResultFilter.OnResultExecuting前IResultFilter.OnResultExecuted

現在你與授權屬性證明是行動過濾器,它使開發人員能夠在Action Filter生命週期中更改/更改操作結果。在授權屬性中,如果用戶未通過驗證,則它將行動結果更改爲HttpUnauthorizedResult。現在,你說的是什麼

東西轉換到這401頭

,但實際上它是HttpUnauthorizedResult其設置響應頭401在實例的ActionResult對象。一旦ActionResult被實例化,它將被刷新到HTTP響應管道。

1

周圍挖一點點,我看到所有ActionResults從抽象類ActionResult的,它有一個抽象方法繼承:的ExecuteReuslt

public abstract class ActionResult 
{ 
    public abstract void ExecuteResult(ControllerContext context); 
} 

正是這種方法每個動作的結果與自己的實現邏輯。

因此,舉例來說,JsonResult需要指定的ContentType:

response.ContentType = "application/json"; 

雖然FileResult設置了 「內容處置」 標題:

context.HttpContext.Response.AddHeader("Content-Disposition", headerValue);