普通的.NET Web服务应用程序中HTTP会话状态的替代方案

Chr*_*her 8 c# ajax jquery state web-services

经过与ASP.NET页面生命周期及其性能的长期斗争,我们已经开始重构我们的Web应用程序,以在客户端实现Web服务(普通的.asmx .NET Web服务)和jQuery.注意:这不以任何方式实现MVC或ASP.NET,这些只是Web服务.

在应用程序的两个分配中,我们在单个页面中动态生成所有内容.在ASP.NET分配中,这意味着(由于页面生命周期)整个页面需要被拆除并重建(几乎)每个AJAX调用或更改为Web表单.这为旨在为许多并发用户提供服务的应用程序带来了巨大的可扩展性问题.在Web服务/ jQuery分配中,我们可以有选择地只关注需要向服务器发送或接收数据的DOM元素,这意味着更少的请求和更快的用户体验.

该应用程序的第一次迭代显示性能提高了一个数量级; 但是,随着我们开始构建越来越多的Web服务,应用程序的性能现在与ASP.NET分配的性能相当.

经过大量谷歌搜索/灵魂搜索和负载测试后,很明显HTTP Session是罪魁祸首.实质上,每次读取(有时通过简单地在Web服务方法范围中包含Session)都是阻塞调用,它会引入500ms的延迟.一旦你知道在哪里看,这在MSDN文献中有详细记载.实现时,Session(如果由同一用户使用多个Web服务)将异步请求转换为具有500ms缓冲区的同步请求.我们通过将所有AJAX调用链接为彼此的"成功"事件来缓解这种情况,从而使它们成为来自客户端的同步请求.这消除了请求对锁定的Session对象进行读取所导致的500ms延迟.

使客户端应用程序以"同步"方式运行已解决了许多性能问题; 然而,这只是短期内的一个临时解决方案.

什么可行的(可扩展的!)替代Session存在,再次记住,我们不是在ASP.NET或MVC或WCF等?我们最大的障碍是我们的元数据集合的持久性,该集合在登录时为每个用户初始化.这是应用程序中最昂贵的操作(10倍或更多),也是我们只想执行一次的操作.会议提供了一种简单的方式,让老人一次流汗,永不回头; 但这种方法看起来不太可行.

一种方法可能是消除这个单一的元数据集合神类,并将这个一神论类演变为半神论者的多神论集合.可以以更低的成本更频繁地完成半神人的实例化.可行,但需要大量的重构,广泛的开发和QA时间.另一个候选者只是将所有状态信息存储在数据库中,但这有其自身的成本 - 延迟并非最不重要.

是否有任何其他解决方案可能涉及较低的实施工作量?

O.O*_*O.O 1

解决你的问题真的很容易。

  1. 关闭整个网站的 web.config 中的会话
  2. 在sql server中创建表:

    创建表Session(SessionId int(或guid)……)

  3. 创建单独的表,这些表具有返回会话表的外键(具有删除级联)并存储会话特定信息

  4. 在应用程序端,将 SessionId 存储在 cookie 中或查询字符串中。然后,您可以按需查找所需的所有会话信息。这将比默认会话状态提供程序快得多,因为您仅在需要信息时才获取信息!此外,您不必再背着默认的会话对象。