【发布时间】:2009-04-20 07:34:20
【问题描述】:
我正在开发一个基于 Ajax 的应用程序,该应用程序大量使用服务器调用来与数据库通信的 WCF 层。 每当我从客户端(一个 ASP.NET 页面)在短时间内对底层 WCF 服务进行多次调用时,系统就会挂起并进入空闲状态。
如何处理此类并发问题? 谢谢。
【问题讨论】:
我正在开发一个基于 Ajax 的应用程序,该应用程序大量使用服务器调用来与数据库通信的 WCF 层。 每当我从客户端(一个 ASP.NET 页面)在短时间内对底层 WCF 服务进行多次调用时,系统就会挂起并进入空闲状态。
如何处理此类并发问题? 谢谢。
【问题讨论】:
我怀疑你在 .svc 和 Web.config 中打开了[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
您不需要 Session 并且禁用 AspNetCompatibilityRequirements 将解决您的问题。
或者您可能需要它只读,因此您可以更改 Global.asax.cs 中特定 svc 的 SessionStateBehavior。顺序阻塞将停止。
protected void Application_BeginRequest(object sender, EventArgs e) {
if (Request.Path.Contains("AjaxTestWCFService.svc")) {
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.ReadOnly);
}
}
但是请注意,SessionStateBehavior.ReadOnly 将阻止写入会话而不会引发异常。写入的值将返回为 null。
如果您确实需要 WCF 服务中的读/写会话,您可以尝试使用 SQLServer aspsessionstate mode,它可能不会暴露相同的阻塞行为。
【讨论】:
没有你的配置很难帮上忙,但是
【讨论】:
好吧,假设问题不在于 DB 并发性或与 Web 服务器硬件相关,那么可以尝试以下方法... WCF 有一些限制默认值,导致我的一个应用程序出现类似问题。默认值非常低(例如 20 个并发调用/会话/实例) 将以下内容添加到您的配置中:
<!--add a behavior to modify the throttling -->
<behaviors>
<serviceBehaviors>
<behavior name="LessThrottlingBehavior">
<serviceThrottling
maxConcurrentCalls="100"
maxConcurrentSessions="100"
maxConcurrentInstances="100"
/>
</behavior>
</serviceBehaviors>
</behaviors>
<!-- modify the service to point to this behavior -->
<services>
<service name="MyWCFServer.WCFServer" behaviorConfiguration="LessThrottlingBehavior">
</service>
</services>
【讨论】:
如果 WCF 层通过 HTTP 进行通信,您可能会达到 HTTP 层的最大传出连接数。
http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx
服务器环境中的默认值为 10,这意味着从您的应用程序服务器到 WCF 层最多可以有 10 个并发传出连接。只需根据估计的并发 WCF 调用数将此值更改为更大的值。
具体来说,将其放入前端 Web 应用程序中的 Application_Start(调用 WCF 服务的应用程序,而不是使用 WCF 服务的应用程序):
System.Net.ServicePointManager.DefaultConnectionLimit = 200;
【讨论】: