我在ASP.NET应用程序中的AJAX请求流量很大。

用户登录我们的Web应用程序后 会议 创建以存储此用户状态的信息。目前,我们保留的解决方案 会议 数据一致非常简单且残酷: 每个请求需要在处理之前获得独家锁.

这适用于传统网络应用程序。但是,当Web应用程序转向支持Ajax时,它不高效。很有可能在不重新加载网页的情况下同时发送多个AJAX请求。如果所有AJAX请求都通过独家锁定序列化,则响应不是那么快。无论如何,许多AJAX请求无法访问 会话变量 也被阻止。

如果我们没有针对每个请求的独家锁定,那么我们需要仔细治疗所有种族条件,以避免死锁。恐怕这会使代码变得复杂和越野。

因此,是否有最好的做法可以使会话数据保持一致并保持代码简单清洁?

有帮助吗?

解决方案

我给您一个解决此问题的总体想法。

利用 静音, ,对于Mutex名称,请使用会话ID。

您给出的名称上的Mutex锁定基础,因此您可以避免会话之间的冲突。

一个简单的例子 http://aspalliance.com/290

Mutex vs Lock

这是一些答案
在C#中监视与Mutex

C#中各种线程同步选项之间有什么区别?

在您的情况下,如果您将其用作mutex名称“会话ID”,则将使用此名称锁定。来自不同会话ID的人不会被锁定,您只会从同一会话ID中锁定相同的人。

您描述的是,您的用户可以锁定所有用户,因此使用Mutex(SessionID),这不会发生。

许多池,在同一家服务器中

如果您在同一台服务器上运行,则可以使用Mutex。

许多网络服务器

如果您赢了不同的Web服务器,则需要具有一个共同的基础,Ether一个通用数据库,即可以读,写,锁定等的通用目录。

对于公共目录:
在这种情况下,我不知道您是否可以使用类似的名称来创建一个sutex。删除它们,文件的锁定是您要求的锁。

对于常见数据库:
您可以创建一个表格,您可以用来锁定和同步操作,从而使穆特斯的动作类似。

其他提示

用户登录我们的Web应用程序后,将创建一个会话来存储此用户状态的信息。当前,我们保持会话数据一致的解决方案非常简单且残酷:每个请求都需要在处理之前获取独家锁”。

"我们的解决方案“将暗示您不使用SessionStateModule并使用自定义解决方案。无论如何,如果您使用ASP.NET提供的默认“ session”对象,它已经具有锁定功能,并且无需再次实现它。

ASP.NET提供了标记接口IREADONLYSESSIONSTATE,以指示特定的请求仅需要读取对会话的访问(因此,该会话不会锁定该特定请求)。点击 这里 并导航到“并发请求和会话状态”部分,以查找更多详细信息

现在,提出您的问题,使用此标记接口作为AJAX服务器端页面方法的方法是设置页面的属性使SessionState能够“ ReadOnly”。

如果您使用的是Ajax Pro,则可以在您的方法上使用ajaxpro.ajaxmethod(httpsessionrequirement.readonly)属性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top