我在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>
答案 0 :(得分:0)
ConcurrencyMode = ConcurrencyMode.Single //set to multiple
您可能会遇到网络问题,从而导致重试和彼此死锁。通常,如果将WCF代码托管在WPF应用程序中,则它应该异步运行,否则您可能会因连接失败而陷入僵局。