2012-04-17 60 views
2

我有一個問題很少發生,但無論如何都可能被捕獲。這個問題有時會在我打電話給某個控制器的時候有很大的時間延遲。我已經記錄的時間和結果看起來很奇怪:初始化和操作之間會發生什麼?

> -->BeginRequest: /Data/MyController Now: 17:47:37:248 Thread id = 22 
> ---->Prerequest: /Data/MyController Now: 17:47:37:249 Thread id = 22 
> ------>Init DataController: /Data/MyController Now: 17:47:37:250 Thread id = 22 
> ------>/Data/MyController executing: Now: 17:47:46:302 Thread id = 22 
> == /Data/MyController inside: now is 17:47:46:304 

的BeginRequest和Prerequest的事件記錄到Global.asax中,並初始化爲controller.Initialize重寫方法,執行 - 從OnActionExecuting的控制器。

正如你所看到的,初始化和執行控制器之間差不多有10秒。我不明白這段時間發生了什麼事。我應該檢查什麼事件?

+0

Init方法做什麼? – MikeSW 2012-04-17 18:37:55

+0

什麼都沒有。只需記錄信息。它的重寫無效Initialize(System.Web.Routing.RequestContext requestContext) – mimic 2012-04-17 18:39:21

回答

3

在Initialize方法和輸入控制器動作之間可能會發生很多事情。您可以查看提供深入概述的following article。你可以下載the poster here

基本上初始化控制器所發生的步驟之後是:

  1. 授權(多個)濾波器OnAuthorization方法被調用
  2. 型號粘合劑反序列化參數
  3. 動作(多個)濾波器OnActionExecuting方法被稱爲

在文章中顯示的圖表中存在一個輕微的錯誤,其中步驟1和2被顛倒。事實上,授權過濾器在模型活頁夾之前執行。

因此,您應該在代碼中查找的是自定義授權篩選器,自定義模型聯編程序和自定義操作篩選器。所有這些都可能導致您在控制器的初始化邏輯和輸入控制器操作之間觀察到的放緩。

+0

謝謝。我會看看這些方法和事件。控制過濾器不適用於給定的控制器,所以可能存在一些序列化問題。 – mimic 2012-04-18 20:09:31

+0

小切線,但如果在步驟2中發生綁定,是否有辦法在OnActionExecuting中獲取綁定模型(傳入)? filterContext.Controller.ViewData.Model似乎只是作爲操作結果傳遞給視圖的模型。 – xr280xr 2015-05-27 23:22:06

相關問題