我有兩個jqGrid通過ajax POST調用加載數據到我的控制器,每次運行應用程序時,只有一個POST成功執行。通常情況下,如果我點擊瀏覽器刷新,兩個網格都會正確加載。但是,在每個視圖的第一次加載時,2箇中的1個會失敗(我有兩個視圖/頁面,每個頁面都有2個jqGrid,「儀表板樣式」)。在log4net日誌中,兩個請求有不同的線程,一個總是失敗,而另一個成功,但哪一個成功是隨機的(可能是先到先得,首次服務)...有時,當我試圖迭代通過導致可枚舉的項目列表,其他時間我得到「連接未關閉,連接的當前狀態正在連接。」MVC多個AJAX請求與實體框架導致錯誤
我對這可能是什麼原因有些懷疑:啓用EF延遲加載/代理,錯誤的windsor配置,未在堆棧跟蹤中引發或顯示的automapper錯誤。但是因爲我真的沒有線索,下面是我的設置,以防止它破譯。
持久性 [LifestyleSingleton] - 這包含EF4 datacontext(代碼優先)和對EF4.3的引用。有一個工廠用於創建稱爲GetContext()的Context,並且該工廠實現了IDisposable。
回覆 [LifestylePerWebRequest] - 這包含實現存儲庫和規範模式的存儲庫(http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern /)。
服務 [LifestylePerWebRequest] - 調用回購並應用總線邏輯,即返回用於UI分頁的PagedList對象。
控制器 [LifestyleTransient] - mvc控制器,利用automapper進行映射查看模型類型。
MVC UI - 我正在實現Lib.Web.MVC,它爲jqGrid創建一個強類型的包裝器。從這裏,我用windsor容器做DI。
更新:我更改了所有組件以註冊LifestylePerThread,並且所有的錯誤似乎都已經解決了。但是,我不明白爲什麼..我是DI新手,所以我確信我錯過了一些東西。 有人能解釋爲什麼這解決了這個問題嗎?這種變化會對可擴展性產生什麼影響?我想我會希望上下文工廠和上下文本身一起被註冊爲單例,但顯然這是不正確的。
我已經應用於全球的errhandler過濾器,那麼我的阿賈克斯行動引發異常我已經更新與發佈。 我不太確定你的意思是「會話鎖定」,你能否詳細說明一下?我還沒有使用任何會話變量,但這是否意味着如果我使用會話變量我無法發出沒有鎖定問題的併發/異步請求? – diegohb 2012-03-09 00:56:07
哦,並且返回只是內部服務器錯誤。沒有來自jqGrid onError事件的詳細信息。 – diegohb 2012-03-09 01:05:43
是的,如果會話已啓用,那麼框架將序列化您的傳入請求。當處理來自會話的多個請求時,正在運行的請求將阻止其他請求直到完成。要解決這個問題,你必須使用異步控制器。請參閱此MS文章以獲取良好的概述,http://msdn.microsoft.com/en-us/library/ee728598.aspx。 – Mark 2012-03-09 19:39:21