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

时间:2011-11-24 08:57:28

标签: asp.net web-services session

我创建了一个ASMX Web服务,它在场景后面执行一些Active Directory。

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

但是,当我打开该选项时,应用程序的返回时间 - >网络服务 - >应用程序变得荒谬可笑。 (大约一分钟或更长时间)。

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

任何人都知道发生了什么事?

1 个答案:

答案 0 :(得分:6)

可能的原因:

  1. 会话状态存储在进程外(状态服务器/ SQL服务器)并且获取/存储它需要很长时间
  2. 您正在同一会话下发出多个并发请求(包括服务请求)。 ASP.NET确保一次只执行一个会话满(会话读/写)请求,因此多个并发请求将排队。
  3. 编辑
    对于#2,显而易见的解决方案是避免使用会话状态 - 例如,您是否可以将相关信息放入另一个存储区(如缓存或数据库)(昂贵)。

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