CSharp - C# WCF: 请求通道在等待答复时超时

我有一个小型的应用程序,使用WCF与web服务器通信,这个程序被大约200个客户端使用,每个客户端每分钟发送5-20个请求。

经常得到的错误日志:

the request channel timed out while waiting for a reply after 00:00:59.9989999

请求如下:


ClientService Client = new ClientService();
Client.Open();
Client.updateOnline(userID);
Client.Close();

这是app.config


<configuration>
<configSections>
</configSections>
<startup><supportedRuntime version="v2.0.50727"/></startup><system.serviceModel>
 <bindings>
 <wsHttpBinding>
 <binding name="WSHttpBinding_IClientService" closeTimeout="00:01:00"
 openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
 bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
 maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
 messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
 allowCookies="false">
 <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
 maxBytesPerRead="4096" maxNameTableCharCount="16384" />
 <reliableSession ordered="true" inactivityTimeout="00:10:00"
 enabled="false" />
 <security mode="None">
 <transport clientCredentialType="Windows" proxyCredentialType="None"
 realm="" />
 <message clientCredentialType="Windows" negotiateServiceCredential="true" />
 </security>
 </binding>
 </wsHttpBinding>
 </bindings>
 <client>
 <endpoint address="PATH TO SERVICE"
 binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IClientService"
 contract="IClientService" name="WSHttpBinding_IClientService">
 <identity>
 <dns value="localhost" />
 </identity>
 </endpoint>
 </client>
</system.serviceModel>

每天有200到800次失败。

时间:

看来您的请求在被处理之前正在服务器上排队,然后开始超时。

1)尝试限制您的WCF服务,例如:尝试增加并发会话,看看WCF Throttling

2)尝试使用PerCall,而不是使用Sessions,以确保没有会话保留。以下是在interface上删除会话的操作


[ServiceContract(Namespace="YOUR NAMESPACE", SessionMode=SessionMode.NotAllowed)]

以及实现这些接口的协定类


ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

应该启用跟踪,以便准确地查看发生了什么,

尝试将超时值添加到服务和客户端:


<binding name="BasicHttpBinding_SomeName" closeTimeout="00:01:00"
 openTimeout="00:01:00" receiveTimeout="00:10:00"
 sendTimeout="00:10:00" maxBufferPoolSize="2147483647"
 maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">

检查此性能计数器- ASP.NET Requests Queued .

一个web应用程序可以承载许多网页和服务,IIS默认只处理每个CPU内核的12个并发请求。

这意味着,即使你的服务很快,但其他页面/服务很慢,请求也必须在队列中等待,然后才能执行。

ASP.NET Requests Queued应为零或接近零。

http://msdn.microsoft.com/en-us/library/fxk122b4.aspx

...