【问题标题】:ASP.NET Web Service very slow when [WebMethod(EnableSession = true)][WebMethod(EnableSession = true)] 时 ASP.NET Web 服务非常慢
【发布时间】:2012-01-05 11:08:00
【问题描述】:

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

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

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

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

有人知道怎么回事吗?

【问题讨论】:

  • 你设置了会话服务器吗?
  • 可能是会话数据连接超时?
  • @Steve B:我认为 ASP.NET 服务器框会负责会话,只要启用它?
  • @Aristos 之后我访问网络服务时连续变慢
  • 当您运行多个必须共享会话的前端时,需要会话服务器。与会话存储在内存中的单个框相比。您可以检查这是否在网络配置中设置(寻找sessionState key

标签: asp.net web-services session


【解决方案1】:

可能的原因:

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

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

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

【讨论】:

  • 如果是这些原因,我将如何解决问题?
  • 对不起,我说的是第二个
  • @James,如果 #2 是原因,那么您可以看到排队的请求数量稳步增加。从客户端,您将看到随着请求开始堆积而逐渐降级。有关可能的解决方案,请参阅我在答案中的编辑。
  • 感谢您的回复。事实证明,延迟不是来自会话,而是来自 DirectoryServices 的调用。当我关闭会话时,它导致了一些错误,但被捕获并且没有做任何事情,所以我认为它是一帆风顺的。干杯
  • 但我会将您的答案标记为答案,因为这是对我的正确回应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 2011-05-18
  • 2016-08-06
  • 2013-08-26
  • 2015-06-28
相关资源
最近更新 更多