[WebMethod(EnableSession = true)] 时 ASP.NET Web 服务非常慢

标签 asp.net web-services session

我创建了一个 ASMX Web 服务,它在幕后执行一些 Active Directory 操作。

由于我希望在用户 session 下保留 Web 服务中的某些信息,因此我决定放置 [WebMethod(EnableSession = true)] 并开始使用 Session 变量。

但是,当我打开该选项时,从应用程序 -> Web 服务 -> 应用程序的返回时间变得非常长。 (大约一分钟或更长时间)。

如果我删除[WebMethod(EnableSession = true)],速度相当快。

有人知道这是怎么回事吗?

最佳答案

可能的原因:

  1. session 状态存储在进程外(状态服务器/SQL 服务器),并且获取/存储它需要很长时间
  2. 您正在同一 session 下发出多个并发请求(包括服务请求)。 ASP.NET 确保一次仅执行一个 session 完整( session 读/写)请求,因此多个并发请求将排队。

编辑:
对于#2,明显的解决方案是避免使用 session 状态 - 例如,您可以将相关信息放入另一个存储中,例如缓存或数据库(昂贵)。

如果您仅读取 Web 服务中的 session 状态,那么您可以利用只读 session 状态(请参阅 IReadOnlySessionState )。只读 session 状态允许并发只读请求 - 读/写请求仍会阻止所有其他请求。现在,WebMethod 属性中的 EnableSession 不支持此功能 - 它要么不提供 session ,要么提供读/写 session 。因此,解决方法之一是实现您自己的处理程序,实现 IReadOnlySessionState,然后使用 http 模块将 asmx 请求路由到该处理程序,然后将处理程序切换为默认处理程序。因为您的处理程序需要只读 session 状态,所以您将具有只读 session 状态 - 请参阅此 forum post其中已经给出了切换处理程序的 http 模块。

关于[WebMethod(EnableSession = true)] 时 ASP.NET Web 服务非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8254367/

相关文章:

ios - 在 Web 服务调用响应中自动填充文本

session - 无论 setMaxIdleTimeout 的值如何,Java WebSocket session 都会超时

php - 如果用户计算机 ip 地址与允许的 ip 地址 mysql 表不匹配,则阻止登录使用 Laravel 5.4

c# - ASP :button and javascript popup

asp.net - ASP.Net 的 Web TWAIN 扫描解决方案?

asp.net - 何时在 View 状态中保存变量?

c# - 获取 ScriptHandlerFactory 处理程序

web-services - 使用 Web 服务获取 Moodle 中的所有用户

ASP.NET MVC 通过表单例份验证真正注销

PHP session 编辑器