我创建了一个 ASMX Web 服务,它在幕后执行一些 Active Directory 操作。
由于我希望在用户 session 下保留 Web 服务中的某些信息,因此我决定放置 [WebMethod(EnableSession = true)]
并开始使用 Session
变量。
但是,当我打开该选项时,从应用程序 -> Web 服务 -> 应用程序的返回时间变得非常长。 (大约一分钟或更长时间)。
如果我删除[WebMethod(EnableSession = true)]
,速度相当快。
有人知道这是怎么回事吗?
最佳答案
可能的原因:
- session 状态存储在进程外(状态服务器/SQL 服务器),并且获取/存储它需要很长时间
- 您正在同一 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/