完全替换 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 的会话 的相关文章

  • 使用 sqlite 离线存储数据的 Web 表单应用程序

    我有一个 asp net Web 表单应用程序 它在远程服务器上使用 sql server 2005 所有控件均使用 linq to sql 绑定 我正在尝试提供完整的离线功能 所以我想知道是否可以像 sql server db 一样创建一
  • 如何使用 Blazor 在 ASP.NET CORE 中更新数据库后刷新网页

    我正在制作一个小型房间预订网络应用程序 我希望在给定的时间间隔内刷新网页 即给定的一分钟或对数据库进行更改时 我发现StateHasChanged 但我真的不知道如何实现它 这里是新手一克诺比 我尝试将其放在将约会添加到日程表的函数中 va
  • UpdatePanel 更新时 ASP 页面滚动到顶部

    我遇到一个问题 我有一个 UpdatePanel 它使用计时器来触发用新点更新 ASP 图表 本质上是位于https web archive org web 20201205213920 https www 4guysfromrolla c
  • 使用 jQuery 将参数从一个 ASP.NET 页面传递到另一页面

    我需要使用 jQuery 将 4 个参数 3 个字符串和一个逗号分隔列表 从 ASP NET 页面传递到另一个 ASP NET 页面 目标页面应该作为单独的窗口启动 这与以下 jQuery 片段配合良好 sourcePageBtn clic
  • Laravel - 停止并发访问记录

    在 Laravel 中 有什么方法可以停止同时与同一条记录交互 例如 如果用户 A 正在编辑一条记录 那么我同时需要阻止用户 B 编辑同一条记录 注意 我在 Laravel 5 2 中使用 SESSION DRIVER file 目前大约有
  • 如何创建可点击的gridview行?

    我想创建一个 gridview 行 其中整行都是可单击的 当我单击该行上的任意位置时 它会打开另一个包含行信息的 aspx 页面 我正在使用 asp net 和 C 任何人都可以帮助我吗 提前致谢 触发 Gridview 的两个事件 OnR
  • 良好的错误处理实践

    对于 ASP NET 站点来说 什么是良好的错误处理实践 例子 谢谢 与任何 net 项目一样 我发现最好的方法是仅捕获可能发生在给定页面上的特定错误类型 例如 您可以捕获用户给定输入的格式异常 以防 JavaScript 验证失败并且您没
  • 使用 PHP 对 ASP.NET 成员身份中的用户进行身份验证

    我在尝试使用 PHP 针对现有 ASP NET 成员资格数据库对用户进行身份验证时遇到一些问题 我在网上搜索过 发现现有的答案似乎对我不起作用 即 public static function Hash password salt deco
  • 休眠会话已关闭

    当我调用方法 session begin 事务时 如下所示 session factory is instantiated via a bean Session session this getSessionFactory getCurre
  • 如何在静态方法中获取会话变量的值?

    我正在使用带有 jQ uery 的 ASP NET 页面方法 如何在 C 中的静态方法中获取会话变量的值 protected void Page Load object sender EventArgs e Session UserName
  • 从 Orchard 内的主题渲染图像

    我刚刚选择 Orchard 来构建我的博客 作为创建这个新博客的努力的一部分 我正在创建一个自定义主题 这个自定义主题同时具有 CSS 和图像 我的问题 我的问题基本上可以归结为 如何渲染属于主题一部分的图像 到目前为止我已经尝试过的 我尝
  • 无法访问本地 Docker 容器上的 Asp.Net Core

    我在 asp net core 中创建了一个应用程序 并创建了一个 dockerfile 来生成本地映像并运行它 FROM microsoft dotnet latest COPY app WORKDIR app RUN dotnet re
  • Java 中的无锁并发链表

    我想使用像中描述的链接列表this http reference kfupm edu sa content l o lock free linked lists using compare and 3368 pdf纸 但是 我在网上没有找到
  • 在 gridview 控件中使用单选按钮

    我有一个 gridview 控件 其中使用存储过程显示数据 该网格有三列 第一列包含单选按钮 总体思路是用户应该能够从 在我的例子中 5 个单选按钮中仅选择一个单选按钮 当前功能的问题是我可以同时选择所有单选按钮 我尝试使用 groupna
  • 将数据库中的用户 ID 添加到 Codeigniter 中的会话数据中?

    我是 CodeIgniter 的新手 在从数据库添加用户 ID 用户登录后 到会话数据时遇到问题 这是我的代码问题 之前可能会在 SOF 上被问到 在付出了所有努力之后 我问这个 登录模型
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • 名称在当前上下文中不存在

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

    我想使用复选框获取从 gridview 选择的行 复选框是这样的
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 什么可以解释托管堆上超过 5,000,000 个 System.WeakReference 实例?

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

随机推荐