【问题标题】:ASP.NET -> WCF concurrency problemASP.NET -> WCF 并发问题
【发布时间】:2009-04-20 07:34:20
【问题描述】:

我正在开发一个基于 Ajax 的应用程序,该应用程序大量使用服务器调用来与数据库通信的 WCF 层。 每当我从客户端(一个 ASP.NET 页面)在短时间内对底层 WCF 服务进行多次调用时,系统就会挂起并进入空闲状态。

如何处理此类并发问题? 谢谢。

【问题讨论】:

    标签: asp.net vb.net wcf


    【解决方案1】:

    我怀疑你在 .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,它可能不会暴露相同的阻塞行为。

    【讨论】:

      【解决方案2】:

      没有你的配置很难帮上忙,但是

      • 调用后客户端处理/chanell 是否正确关闭?
      • 您的服务是per callsingleton还是per session
      • 您是否尝试过Fiddler 或其他跟踪工具来捕获您的http 流量?

      【讨论】:

        【解决方案3】:

        好吧,假设问题不在于 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>
        

        【讨论】:

          【解决方案4】:

          如果 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;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-09-05
            • 1970-01-01
            • 1970-01-01
            • 2011-09-29
            • 2012-11-10
            • 1970-01-01
            • 2012-03-30
            • 2011-05-02
            相关资源
            最近更新 更多