完全替换 ASP.Net 的会话

2024-05-04

ASP.Net 会话对于传统的 WebForms 应用程序来说似乎很完美,但它们所做的一些事情对于现代 AJAX 和 MVC 应用程序来说是一个严重的问题。

具体来说,访问 ASP.Net 提供程序只有 3 种方法:

  1. 锁定读和写(默认)- 会话被锁定AcquireRequestState射击直到ReleaseRequestState火灾。如果浏览器同时发出 3 个请求,它们将在服务器上排队。这是 MVC 2 中的唯一选项,但 MVC 3 允许...

  2. 非锁定只读- 会话未锁定,但无法保存。这似乎是虽然不可靠 https://stackoverflow.com/questions/8939188,因为某些读取似乎再次锁定会话。

  3. 会话已禁用- 任何读取或写入会话的尝试都会引发异常。

然而,对于现代 MVC 应用程序,我会同时发生大量 AJAX 事件 - 我不希望它们在服务器上排队,但我确实希望它们能够写入会话。

我想要的是第四种模式:脏读,最后写入获胜

我认为(很高兴得到纠正)做到这一点的唯一方法是完全替换 ASP.Net 的会话。我可以写我的自己的提供商 http://msdn.microsoft.com/en-us/library/ms178587.aspx,但 ASP 仍会使用它支持的 3 种模式之一来调用它。有没有办法让ASP.Net支持乐观并发?

这让我用一个新类替换了对会话的所有调用,该类基本上执行相同的操作,但不锁定 - 这是一个痛苦。

我希望以最少的代码替换量保留尽可能多的当前会话内容(最重要的是各种日志中的会话 ID)。有什么办法可以做到这一点吗?理想情况下我想要HttpContext.Current.Session指向我的新类,但没有 ASP.Net 锁定任何请求。

有人已经做过这样的事情了吗?奇怪的是,对于所有 AJAXey MVC 应用程序来说,这是 ASP 的一个新问题。


首先我说 MS asp.net 锁定了“asp.net 处理页面”会话的核心,位于“webengine4.dll“asp.net 4 的 dll

我是从 MS 的角度说的asp.net act correct and lock the session this way因为asp.net无法知道我们在会话中保留什么类型的信息,所以可以做出正确的“最后写入获胜”。

同样正确的是锁定为会议整页因为这种方式为您提供了非常重要的程序同步,根据现在的经验,我说您的大部分操作都需要它。在我用我的会话替换 ms 会话后,我的所有操作都需要进行全局锁定,否则我会遇到双重插入、双重操作等问题。

I give 一个例子我在这里认识到的问题。会话数据保存在 SessionSateItemCollection 中,它是一个键列表。当会话读取或写入此集合时,所有这些操作都会一起完成。那么我们来看看这个案例吧。

我们在会话中有树变量,“VAR1”,“VAR2”,“VAR3”

Page 1.
getsession(实际上获取所有数据并将它们放在列表中)
会话[VAR1] = "数据1";
保存会议()
结果为 VAR1=data1,VAR2=(var2 的最后一个数据),VAR3=(var3 的最后一个数据)

Page 2.
getsession(实际上获取所有数据并将它们放在列表中)
会话[VAR2] = "数据2";
保存会议()
结果为 VAR1=(var1 的最后一个数据), VAR2=data2, VAR3=(var3 的最后一个数据)

Page 3.
getsession(实际上获取所有数据并将它们放在列表中)
会话[VAR3] = "数据3";
保存会议()
结果为 VAR1=(var1 的最后一个数据), VAR2=(var2 的最后一个数据) VAR3="data3"

请注意,每个页面都有数据的克隆,因为他从会话介质中读取它们(例如,最后一次从数据库中读取数据)

如果我们让这 3 个页面在没有锁定的情况下运行,我们实际上并没有脏读,也没有“最后写入获胜” - 我们这里拥有的是“最后一个写入破坏了其他写入”,因为如果你再想一想,当 VAR1 改变时,为什么 VAR2 和 VAR3 保持不变?如果你在其他地方改变了 VAR2 怎么办?

出于这个原因,我们不能让它不加锁。

现在用 20 个变量来想象……完全混乱。

可能的解决方案

由于 asp.net 的多个池是多线程的,跨池和跨计算机保持相同数据的唯一方法是拥有一个公共数据库,或者像 asp.net State Service 这样的所有进程程序共用的数据库。

我选择拥有一个通用数据库,因为它比为此建议创建一个程序更容易。

现在如果我们连接a cookie我们制造的,至用户 至会话的数据用户,并且我们使用完全自定义的数据库字段来控制数据,我们知道我们想要锁定什么,不锁定什么,如何保存或更改,或者比较并保留最后写入获胜的数据,我们可以使这项工作正常进行,并完全禁用asp.net session 是一个通用的会话管理器,可以满足所有需求,但不能处理像这样的特殊情况。

asp.net 可以在未来的版本中实现此功能吗?是的,他可以通过创建一个名为脏的额外字段,并在会话上保存数据,使用脏字段或类似的东西来合并数据,但不能这样做现在按原样工作——至少从我到目前为止所发现的情况来看是这样。
实际上 SessionStateItem 在属性上有一个脏标志,但没有在保存数据结束时进行合并。如果有人想找到一种现有的 ms asp.net 会话状态管理器的解决方案,我真的很高兴,我正在写我到目前为止所发现的内容,但这并不意味着肯定没有办法 - 我还没有发现它就是这样。

希望一切有帮助:)

自定义会话状态模块

在这个答案中https://stackoverflow.com/a/3660837/159270 https://stackoverflow.com/a/3660837/159270James 在编写自定义模块后说道:我仍然不敢相信 ASP.Net Session 的自定义实现会锁定整个请求的会话。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

完全替换 ASP.Net 的会话 的相关文章

  • 必填字段验证器在下拉列表回发时消失

    我在 asp net 中填充两个下拉列表 两者都分配给必填字段验证器 隐藏代码如下 if Page IsPostBack DataTable dt new DataTable dt Columns Add emp dt Columns Ad
  • Entity Framework Core 中的两个外键

    我在使用 Entity Framework Core 创建数据库时使用代码优先方法 我想创建两个指向同一个表的外键 我的示例显示用户表将保存用户 ID 消息表将保存接收者 ID 和发送者 ID 这意味着两个值必须指向同一个表 用户代码 pu
  • Django HTTPS 和 HTTP 会话

    我使用 Django 1 1 1 和 ssl 重定向中间件 通过 HTTPS 创建的会话数据 身份验证等 在站点的 HTTP 部分中不可用 无需将整个站点设置为 HTTPS 即可使其可用的最佳方法是什么 这是设计使然 您无法轻易更改 当通过
  • UpdatePanel 更新时 ASP 页面滚动到顶部

    我遇到一个问题 我有一个 UpdatePanel 它使用计时器来触发用新点更新 ASP 图表 本质上是位于https web archive org web 20201205213920 https www 4guysfromrolla c
  • 浏览器关闭时 Omniauth 会话过期

    在我的 Rails 3 应用程序中 我使用 Omniauth 进行用户身份验证部分 fb twitter 实际上我遵循这个 https github com RailsApps rails3 mongoid omniauth https g
  • Laravel - 停止并发访问记录

    在 Laravel 中 有什么方法可以停止同时与同一条记录交互 例如 如果用户 A 正在编辑一条记录 那么我同时需要阻止用户 B 编辑同一条记录 注意 我在 Laravel 5 2 中使用 SESSION DRIVER file 目前大约有
  • 如何为本机启用现有 WCF 服务的 JSONP?

    我有一个现有的服务 如下方法 AspNetCompatibilityRequirements RequirementsMode AspNetCompatibilityRequirementsMode Allowed ServiceBehav
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • 将 HTML 表格导出到 Excel

    我在 ASP NET MVC 视图页面上有 HTML 表 现在我必须将该表导出到 Excel 1 我使用部分视图 Inquiries ascx 来显示数据库中的表数据 使用LINQ to Entity 2 我还使用了 UITableFilt
  • 在 gridview 控件中使用单选按钮

    我有一个 gridview 控件 其中使用存储过程显示数据 该网格有三列 第一列包含单选按钮 总体思路是用户应该能够从 在我的例子中 5 个单选按钮中仅选择一个单选按钮 当前功能的问题是我可以同时选择所有单选按钮 我尝试使用 groupna
  • 当从属文本框中没有输入文本时,如何让 gridview 显示所有表格行?

    下面的代码可以正常工作 并根据文本框中输入的文本过滤我的网格视图 当我的文本框中没有输入任何文本时 我没有得到任何结果 并且无法理解为什么 我的问题 如何让gridview显示all当文本框中没有输入文本时表行 MSSQL Search n
  • 如何处理 AJAX 请求中的会话超时

    我相信你们都熟悉使用 AJAX 的投票系统 嗯 看那边 我有类似的东西 当你投票赞成或反对时 它使用 AJAX 从 votes php 请求新值 问题是我正在使用会话来获取用户 ID 因此一个人只能投票一次 如果他们在页面上坐了一个小时然后
  • 关于java中的生产者和消费者模式与阻塞队列方法

    我正在研究有关java中线程的生产者和消费者设计模式 最近我在java 5中进行了探索 并介绍了Java 5中BlockingQueue数据结构的介绍 现在它变得更简单了 因为BlockingQueue通过引入阻塞方法隐式地提供了这种控制p
  • 名称在当前上下文中不存在

    所以 我正在我的笔记本电脑和台式机之间完成这个项目 该项目在笔记本电脑上运行 但现在将更新的源代码复制到桌面上后 我的项目中有超过 500 个错误 所有这些错误都是 该名称在当前上下文中不存在 这是一个例子 职位 aspx
  • 获取GridView中选定行的索引

    我想使用复选框获取从 gridview 选择的行 复选框是这样的
  • 将 Windows 窗体应用程序转换为 Asp.net

    我问的是 您之前使用的将 C Windows 窗体应用程序转换为 ASP NET 的最佳工具是什么 我已经关于这个主题 发现了很多工具 但我希望有人根据他的使用情况推荐最好的工具 我真的不建议使用工具来进行转换 Web 应用程序和 WinF
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • 什么可以解释托管堆上超过 5,000,000 个 System.WeakReference 实例?

    我一直在针对生产 ASP NET Web 应用程序运行负载测试 并且看到在堆上创建了大量 System WeakReference 在大约 15 分钟内 负载管理堆内存已飙升至大约 3GB 并且我有大约 5 000 000 个对 Syste
  • 自定义错误页面未显示

    由于某种原因 当我收到 ASP NET 运行时错误时 它不会加载我的自定义错误页面
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐