WCF客户端应用程序开始不断接收超时异常

时间:2018-08-14 09:14:25

标签: c# wcf

我在WCF服务器端遇到问题。 它大约在一个月前开始,我们之前(大约一年)没有发现。现在,我们的客户端应用程序开始不断接收超时异常。 客户端和服务是桌面WPF应用程序。服务托管在远程服务器上。 通过调试(附加到主机进程)和日志(.svclog),我们发现有时我们的主机在短时间内会收到来自同一ip地址的许多请求(并且处理它们需要多个线程)。 10个请求中有9个由于通信异常而失败。在每种情况下,启动和失败之间的时间都不同。从20分钟到1小时不等。 同时,其他客户端无法连接到服务。我怀疑会发生这种情况,因为所有可用线程都可与一个客户端一起使用,直到失败为止。 我们手动修改了ConcurrencyMode,UseSynchronizationContext,但没有修改主机配置中的发送,打开,接收,关闭超时,因为据我所知它们应该默认为1分钟。 我们想中断长请求,或者只允许一个线程处理它们。

我们的服务配置: .cs服务文件

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerCall, AddressFilterMode = AddressFilterMode.Any, UseSynchronizationContext = false)] 

app.config

<system.serviceModel>
     <bindings>
       <wsHttpBinding>
         <binding name="htWsHttpEndpointBinding" maxReceivedMessageSize="2147483647">
          <security mode="None" />
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="XService" behaviorConfiguration="htServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://ip/Xservice" />
          </baseAddresses>
        </host>   
        <endpoint address="http://ip/Xservice" binding="wsHttpBinding" bindingConfiguration="htWsHttpEndpointBinding" contract="IXService" />
        <endpoint address="mex" binding="wsHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="htServiceBehavior">
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
          <serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors> 
   </system.serviceModel>

客户端app.config

<system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_IXService" maxReceivedMessageSize="2147483647">
          <security mode="None"/>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://ip/XService"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IXService"
                contract="IXService" name="WSHttpBinding_IXService"/>         
    </client>
  </system.serviceModel>

1 个答案:

答案 0 :(得分:0)

ConcurrencyMode = ConcurrencyMode.Single //set to multiple

您可能会遇到网络问题,从而导致重试和彼此死锁。通常,如果将WCF代码托管在WPF应用程序中,则它应该异步运行,否则您可能会因连接失败而陷入僵局。