我最近對我的MVC3應用程序進行了更改,試圖正確處理DbContext
對象[1]。這在開發過程中非常有效,但是一旦應用程序被推送到我的生產服務器,我就會間歇性地開始一些有趣的異常,這些異常會一直持續到AppPool被回收。例外情況可以在我的自定義AuthorizeAttribute
可以追溯到代碼如下所示:處理DbContext後的問題
System.InvalidOperationException: The 'Username' property on 'User' could not be set to a 'Int32' value. You must set this property to a non-null value of type 'String'.
System.InvalidOperationException: The 'Code' property on 'Right' could not be set to a 'String' value. You must set this property to a non-null value of type 'Int32'.
(數據庫模式是這樣的:用戶:[的Guid,字符串,...],權利:[的Guid,的Int32。 ..])
這就好像有些「電線越過了」,應用程序正在混合來自數據庫的結果:試圖將Right
結果實現爲User
,反之亦然。
爲了管理DbContext
的處置,我把代碼存儲在每個控制器級別。處置控制器時,我也處理DbContext
。我知道這很無禮,但AuthorizeAttribute
通過filterContext.Controller
使用相同的上下文。
在這個莊園裏處理DbContext
的對象生命週期有什麼問題嗎?是否有任何合理的解釋爲什麼我得到上面的交叉例外?
雖然我明白沒有必要處理DbContext
對象,但我最近遇到了很多來源,聲稱這是最佳實踐。
編輯(每@ MikeSW的評論)
表示DbContext
在OnAuthorization
方法被設置,當AuthorizationContext
是在範圍AuthorizeAttribute
的一個性質。此屬性隨後將在AuthorizeCore
方法中使用。
你能分享一下你的自定義AuthorizeAttribute的相關代碼嗎?請注意,一個屬性被asp.net mvc用作單例。你還使用DI容器嗎? – MikeSW 2013-04-10 12:25:35
@MikeSW我在上面添加了關於使用的信息。我沒有使用DI容器。使用上面提供的信息,看起來好像這些錯誤是由於併發發生的:在OnAuthorization和AuthorizeCore之間的時間內,另一個請求觸發OnAuthorization並且破壞DbContext屬性。這是否遵循? – 2013-04-10 15:07:45
是的,那是你的問題。 [Authorize]基本上是一個單例,並且您正在使用每個請求更改dbcontext屬性。我建議使用DI容器,用HttpPerInstance生存期註冊DbContext,然後在OnAuthorization方法中使用DependencyResolver.Current.GetService()。容器也應該處理DbContext的處理 –
MikeSW
2013-04-10 15:24:18