我最近对我的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