代码之家  ›  专栏  ›  技术社区  ›  Orion Edwards

使用wshttpbinding时,wcf并发请求堆积在服务器上

  •  26
  • Orion Edwards  · 技术社区  · 15 年前

    我有一个wcf客户机/服务器应用程序,它使用wshttpbinding通过HTTP进行通信。

    服务器设置 :自我托管,使用标准WCF ServiceHost . 我的实际服务等级为:

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, 
     InstanceContextMode = InstanceContextMode.PerSession, 
     UseSynchronizationContext = false)]
    

    客户端设置 :使用Visual Studio生成的客户端代理 同步的 服务电话(服务电话) proxy.call_server_method 阻止,直到服务器完全响应。)

    脚本 : 我有一个特定的方法调用,在服务器上执行它需要20秒。客户机在单独的线程中调用此方法,因此它不会被阻塞,并且 ConcurrencyMode.Multiple 意味着wcf也应该在服务器上的单独线程中执行它。

    当我配置我的应用程序使用 NetTcpBinding 一切正常。

    问题 :
    如果我配置应用程序使用 WSHttpBinding ,则此长方法调用会导致HTTP请求“备份”。我通过检查日志和使用fiddler调试HTTP请求来验证这种行为。

    例子:

    • 客户端在后台线程上启动20秒长的请求
    • 客户端在前台线程上启动请求B和C
    • 请求B和C被发送到服务器,直到20秒长的请求完成后,服务器才会处理它们。

    但有时:

    • 请求B和C 请勿发送 (它们甚至不会出现在小提琴手中)直到20秒的请求返回(这是罕见的)。
      • 注:设置 <add address="*" maxconnection="100"/> 在客户机的app.config中,这(似乎)停止了。
    • 请求B被发送并立即收到响应,而请求C被延迟到20秒完成(这很少见)

    下面是Fiddler演示问题的时间表:(单击可获得更大版本)

    如您所见,请求都在服务器上备份。一旦20秒的请求完成,所有的响应都会蜂拥而至,但请注意,有些请求 不是 被耽搁了…

    所以, 问题 :

    • 这到底是怎么回事?为什么它用起来很好 NETTCP绑定 不工作使用 WSHTPTP-绑定 ?
    • 为什么不一致的行为?
    • 我能做什么来修复它?

    笔记:

    • 它没有锁定服务器。我设置了断点并使用了 !syncblk 它一贯报告说没有锁被锁住。
    • 这不是我的线程(否则nettcpbinding不应该工作)
    • 我有 <serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" /> 在服务器的app.config中设置
    • 20秒的呼叫只是在等待计时器,它不会影响CPU、磁盘或网络。
    • 我更喜欢一个不涉及重新设计应用程序的解决方案来使用异步调用…这是一大堆遗留代码,我真的不想把我不理解的东西弄乱。
    8 回复  |  直到 9 年前
        1
  •  11
  •   Brian    15 年前

    WCF(一个.NET或Windows对象)之外有一些限制,默认情况下只允许最多两个同时出站HTTP连接。不幸的是,我一辈子都记不起这个东西的名字(以及你在app.config或你的app中放了什么来覆盖它)。考虑到您没有看到请求离开客户机,而且这只是HTTP,我认为您正在点击“那个东西”。我会一直找它的名字。

    更新:找到了-在客户端上尝试此操作(但将“2”更改为更大的数字):

    <configuration>
      <system.net>
        <connectionManagement>
          <add address = "*" maxconnection = "2" />
        </connectionManagement>
      </system.net>
    </configuration>
    
        2
  •  4
  •   Bernie Tschirren    13 年前

    在IIS/ASP.NET中托管的JSON服务中,我们看到了完全相同的症状。

    根本原因是ASP.NET正在同步请求,而不是WCF。我们必须禁用会话状态(在应用程序级别)才能获得并发的WCF方法。

    Web.config: <system.web> <sessionState mode="Off" /> </system.web>

    请注意,我们的服务使用webhttpbinding,而不是wshttpbinding。所以,我不确定这是否也解决了猎户座的问题。

        3
  •  2
  •   Orion Edwards    15 年前

    [自我回答,向其他用户展示我们的最终解决方案]

    最后,我没能解决这个问题。
    我们的最终解决方案是将应用程序从 WSHttpBinding 并上 NetTcpBinding 在生产中——出于性能方面的考虑,我们一直在计划这样做。

    但这是非常不幸的,因为它在 WSHTPTP-绑定 这可能是或可能不是保证。如果有人提出了一个不涉及弃水的解决方案 WSHTPTP-绑定 我很想知道

        4
  •  2
  •   jishi    13 年前

    我认为您达到了协议限制,要解决这个问题,您需要修改客户机上的标准设置:

    http://support.microsoft.com/kb/183110

    http://support.microsoft.com/kb/282402

    我猜wshttpbinding在发出请求时使用wininet设置。

        5
  •  1
  •   Serapth    15 年前

    如果改为basichttpbinding,它能工作吗?

    是的,听起来像 this is your problem 会话限制,这让我很恼火。

        6
  •  1
  •   UnKnown    14 年前

    考虑使用concurrencyMode.multiple on per call服务以允许并发 电话。

        7
  •  0
  •   Brian    15 年前

    我忘了-能点菜吗?我认为RM over HTTP可能会保留顺序,但TCP会话可能不会(除非您明确请求)?服务合同上是否有描述有序/无序会话的属性(我忘记了)。

        8
  •  0
  •   user1011138    10 年前

    不确定,但有时来自Silverlight应用程序的并发调用问题与浏览器连接管理有关。对于我来说,解决方案是将其放在app.xaml.cs中,application_startup method as descrive here: http://weblogs.asp.net/olakarlsson/simultaneously-calling-multiple-methods-on-a-wcf-service-from-silverlight

    WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);