我有两个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