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



我创建了一个ASMX Web Service,它在幕后做一些活动目录的事情。

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

然而,当我打开这个选项时,从app -> web service -> app返回的时间变得非常长。(大约一分钟或更长时间)。

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

有人知道发生了什么事吗?

可能原因

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

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

如果你只在web服务中读取会话状态,那么你可以利用只读会话状态(参见IReadOnlySessionState)。只读会话状态允许并发的只读请求——读/写请求仍然会阻塞所有其他请求。现在,来自WebMethod属性的EnableSession不支持这一点—它要么不提供会话,要么不提供读/写会话。因此,一种解决方法是实现自己的处理程序实现IReadOnlySessionState,然后使用http模块将asmx请求路由到该处理程序,然后稍后将处理程序切换到默认处理程序。因为您的处理程序需要只读会话状态,所以您将具有只读会话状态-请参阅论坛帖子,其中提供了切换处理程序的http模块。

最新更新