c# - 普通 .NET Web 服务应用程序中 HTTP session 状态的替代方案

标签 c# jquery ajax web-services state

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

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

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

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

让客户端应用程序以“同步”方式运行已经解决了许多性能问题;但是,这只是短期的权宜之计。

Session 有哪些可行的(可扩展的!)替代方案,请再次记住我们不是在 ASP.NET 或 MVC 或 WCF 等上?我们最大的障碍是我们的元数据集合的持久性,它是为每个登录用户初始化的。这是应用程序中成本最高的单个操作(10 倍或更多),我们只想执行一次。 Session 提供了一种简单的方法,让您一次又一次地为老歌流汗,再也不会回头;但这种方法看起来不太可行。

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

对于这个问题是否有任何其他解决方案可能涉及较低级别的实现工作?

最佳答案

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

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

    创建表 session ( SessionId int(或 guid) ... ... )

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

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

关于c# - 普通 .NET Web 服务应用程序中 HTTP session 状态的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5657561/

相关文章:

c# - CSVReader - CSV 文件中不存在字段

c# - 实现接口(interface)的 Blazor 组件列表

c# - 使用 Razor 在 Cshtml 页面上的条件语句

javascript - 自举开启和关闭拨动开关

javascript - 延迟 javascript 函数执行

javascript - 为什么这些 Javascript 不一样?

c# - Elasticsearch.NET 版本 7 - 如何创建索引

javascript - 删除 'onKeyUp' 搜索的多个请求

javascript - 使用ajax获取目录文件

jquery - 使用 CORS 响应 jQuery 请求时缺少 header