代码之家  ›  专栏  ›  技术社区  ›  pistacchio

ASP.NET->WCF并发问题

  •  0
  • pistacchio  · 技术社区  · 16 年前

    我正在开发一个基于ajax的应用程序,它大量使用服务器对与db通信的wcf层的调用。 每当我在短时间内从客户端(一个asp.net页面)对底层wcf服务执行许多调用时,系统将挂起并进入空闲状态。

    如何处理这样的并发问题? 谢谢。

    4 回复  |  直到 16 年前
        1
  •  1
  •   LukeSkywalker    12 年前

    我想你已经打开了 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 在.svc和web.config中

    或者您不需要会话,禁用aspnetcompatibilityrequirements将解决您的问题。

    或者您可能需要它只读,因此您可以在Gualal.AxA.CS中更改特定SVC的SessionStateBehavior。顺序阻塞将停止。

    protected void Application_BeginRequest(object sender, EventArgs e) {
       if (Request.Path.Contains("AjaxTestWCFService.svc")) {
          HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.ReadOnly);
       }
    }
    

    不过,请注意SessionStateBehavior.ReadOnly将在不引发异常的情况下阻止写入会话。写入的值将返回为空。

    如果在wcf服务中确实需要读/写会话,可以尝试使用 SQLServer aspsessionstate mode 这可能不会暴露相同的阻塞行为。

        2
  •  0
  •   boj    16 年前

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

    • 客户机是否在呼叫后正确释放/关闭?
    • 是你的服务吗 每次呼叫 , 独生子女 每次会话 ?
    • 你试过了吗 Fiddler 或者其他跟踪工具来捕获您的http流量?
        3
  •  0
  •   XDecker    15 年前

    好吧,假设问题不是数据库并发,或者与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
  •  0
  •   Wiktor Zychla    12 年前

    如果wcf层通过http进行通信,则可能达到http层所做的最大传出连接数。

    http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

    服务器环境中的默认值是10,这意味着从应用程序服务器到wcf层最多可以有10个并发传出连接。只需根据估计的并发wcf调用数将此值更改为更大的值。

    具体来说,把这个放到 Application_Start 在前端web应用程序(调用wcf服务的应用程序,而不是使用wcf服务的应用程序)中:

       System.Net.ServicePointManager.DefaultConnectionLimit = 200;