asp.net – 使用System.Web.Providers的OptimisticConcurrencyEx
我正在使用Microsoft的新
Universal Providers在SQL Server中进行会话. SQL Server上的旧会话实现需要一个作业(每分钟运行一次)来清除过期的会话.新的一个检查并清除每个请求.由于我实际上是在SQL Azure中运行,因此我没有SQL Agent来安排作业,所以这听起来像是一种合理的方式(不,我不想为会话支付Azure Cache).
问题是当多个用户同时访问该站点时,他们都试图同时清除相同的过期会话,第二个获得乐观的并发异常. System.Data.OptimisticConcurrencyException: Store update,insert,or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries. at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter adapter) at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) at System.Web.Providers.DefaultSessionStateProvider.PurgeExpiredSessions() at System.Web.Providers.DefaultSessionStateProvider.PurgeIfNeeded() at System.Web.SessionState.SessionStateModule.BeginAcquireState(Object source,EventArgs e,AsyncCallback cb,Object extraData) at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously) 我正在使用ELMAH进行错误记录,这显示出一些频率.在我尝试配置ELMAH以忽略错误之前,有没有人知道一种方法来阻止错误发生在第一位?是否有一些我缺少的新提供商的配置? 解决方法
这个包有一个我称之为bug的东西.进程外会话状态的前提是多个实例可能正在管理会话状态清理.在这种情况下,所有实例都在运行此方法……
private void PurgeExpiredSessions() { using (SessionEntities entities = ModelHelper.CreateSessionEntities(this.ConnectionString)) { foreach (SessionEntity entity in QueryHelper.GetExpiredSessions(entities)) { entities.DeleteObject(entity); } entities.SaveChanges(); this.LastSessionPurgeTicks = DateTime.UtcNow.Ticks; } } 问题是一个实例在其他实体和实体抛出帖子中描述的错误之前删除实体.我要求包作者发布源代码或修复此问题.我未经测试的文本编辑器修复将添加公共虚拟,因此可以覆盖该方法或只是更改它. private void PurgeExpiredSessions() { using (SessionEntities entities = ModelHelper.CreateSessionEntities(this.ConnectionString)) { var sqlCommand = @"DELETE dbo.Sessions WHERE Expires < GETUTCDATE()"; entities.ExecuteStoreCommand(sqlCommand); this.LastSessionPurgeTicks = DateTime.UtcNow.Ticks; } } 包的作者非常快速地回复(在发布时回答!)今天他们表示他们正在努力发布代码,但他们可能能够解决这个问题.我要求ETA,如果我拿到ETA,我会尝试跟进. 很棒的包装,只需要一点维护. 正确答案:等待源代码发布或修复更新.或者自行解编译并修复(如果这与许可证一致!) *更新包主人正在考虑本周修复它.是啊! private void PurgeExpiredSessions() { try { using (SessionEntities entities = ModelHelper.CreateSessionEntities(this.ConnectionString)) { foreach (SessionEntity entity in QueryHelper.GetExpiredSessions(entities)) { entities.DeleteObject(entity); } entities.SaveChanges(); this.LastSessionPurgeTicks = DateTime.UtcNow.Ticks; } } catch { } } 感谢包装团队的快速反应和大力支持!!! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 命令行选项,用于将msi安装告知特定位置
- 基于EntityFramework 6 Code First实现简单的多租户系统,支
- asp.net-mvc-3 – 如何将数据自动完成HTML属性添加到TextBo
- 跟着老桂学ASP.NET Core 2.0
- asp.net – FormsAuthentication.RedirectFromLoginPage与R
- asp.net-mvc – 从ASP.NET在Office Web Apps中打开excel /
- asp.net-mvc – ASP.NET MVC – 通过GET提交时,让Html.Begi
- OAuth(OAuth2)ASP.NET REST Web API(自我主机 – Windows服
- ASP.NET应用程序中需要定时炸弹
- asp.net – 如何从usercontrol处理页面事件? (VB.net)
- asp.net – 使用xml类型在SQL Server 2005中存储
- asp.net – 估算Web应用程序峰值带宽需求的最准确
- asp.net – 如何将服务器时间转换为本地时间
- asp.net – 不能从代码隐藏在FormView上加载Drop
- asp.net-mvc-3 – ASP.NET MVC 3中ModelState.Is
- asp.net-mvc – 在ASP.NET MVC应用程序中实现细粒
- asp.net-mvc – 实体框架中的字段最大长度
- asp.net-identity – UserManager RemoveFromRol
- asp.net-mvc – ASP.NET MVC 6中的基本视图页面
- asp.net – 为会话值的关键名称创建枚举是一个好