WCF停止响应约10左右的电话(节stream)
我有一个WCF服务和一个带有服务引用的应用程序,在应用程序中我有一个循环,每次迭代都会调用这个wcf web服务中的方法。
问题是,大约9个电话后,它只是停止…,如果你打VS的Pause
button,你会看到它卡在线路,它打电话。
等待一段时间后,这个TimeoutException被抛出:
请求通道在00:00:59.9970000之后等待回复时超时。 增加传递给请求调用的超时值或增加绑定上的SendTimeout值。 分配给此操作的时间可能是更长时间的一部分。
我研究了一下,发现了一些解决scheme,包括在应用程序中编辑app.config,这里是它的摘录:
<serviceBehaviors> <behavior name="ThrottlingIssue"> <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" /> </behavior> </serviceBehaviors>
。
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
然后,在停止debugging之后,几分钟后,popup错误消息,告诉我发生了灾难性故障 。
我该如何解决这个问题? 当我使用正常的Web服务时,我没有这个问题。
作为参考,这里是整个app.config
:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="ThrottlingIssue"> <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" /> </behavior> </serviceBehaviors> </behaviors> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_IDBInteractionGateway" 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="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> <security mode="Message"> <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true" /> </security> </binding> </wsHttpBinding> </bindings> <client> <endpoint address="http://localhost:28918/DBInteractionGateway.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IDBInteractionGateway" contract="DBInteraction.IDBInteractionGateway" name="WSHttpBinding_IDBInteractionGateway"> <identity> <dns value="localhost" /> </identity> </endpoint> </client> </system.serviceModel> </configuration>
[更新]解决scheme:
显然, 每个请求后,你必须Close
连接 …我现在正在closures每个请求后的连接,它的工作就像一个魅力。
虽然我仍然无法理解的是,在我的app.config中,我将我的maxConcurrentCalls和maxConcurrentSessions设置为500,但是我只能设置为10.任何人都有任何答案吗? (也许我在我的app.config上面发布错误)
上述问题的答案(现在是虚线)是因为我正在编辑客户端app.config
,而不是服务configuration文件( web.config
)
允许的并发连接的默认数量是10。
很有可能你的客户没有closures连接。
要增加并发呼叫的数量,您必须将您的行为添加到服务configuration,而不是客户端。
调用clientservice.close()将解决问题。
这个星期我遇到了这个问题,我无法弄清楚发生了什么事情。 其实我确实改变了我的服务到Dispose()
服务客户端,但它似乎没有任何影响。 显然,还有一个服务电话潜伏在某个地方。
值得注意的是,我认为这不是问题:这个限制与web服务的实际连接数无关。 当您点击maxConcurrentSessions
限制时,仍然只有一个实际的套接字连接 。 我正在用netstat
检查这个,这给我带来了一个错误的结论。 所以, 不要将会话与套接字混淆 。
我们为我们的所有WCF服务定义了接口,所以我打算在我的代码中适应这种模式:
IMyService service = new MyServiceClient(); using (service as IDisposable) { service.MyServiceMethod(); }
还有一件有趣的事情是,当服务(和网站)托pipe在IIS上时,这个问题并没有发生。 configuration(几乎)相同,但我不能在该机器上重现此行为。 我想这是一件好事:)
@ John Saunders(关于using
variables赋值):
我通常会将variables赋值放在using
语句中。 但是生成的IMyService不能隐式转换为IDisposable
。 如果你真的想要那里的任务,我想这个select是:
IService service; using ((service = new ServiceClient()) as IDisposable) { }
这仍然留下了variables范围错误的问题。 IService service
的引用是不可用的,但仍在范围内。 所以这方面会更好:
using (IDisposable serviceDisposable = new ServiceClient()) { IService service = (IService)serviceDisposable; }
这需要我引入一个额外的variables名称。 *咩*
这可以通过创build单例类作为Web服务引用和应用程序之间的接口来解决。 那么它将只创build一个服务引用的实例。
class ServiceInterface { private static ServiceInterface _instance; private ServiceClient _service = new ServiceClient ; private ServiceInterface() { //Prevent accessing default constructor } public static ServiceInterface GetInstance() { if(_instance == null) { _instance = new ServiceInterface(); } return _instance; } // You can add your functions to access web service here Public int PerformTask() { return _service.PerformTask(); } }
你可以configuration跟踪和运行循环? 这可能是因为频道出现故障,导致客户超时。
把我的头发拉过了一个类似的问题,而不是由Close()
或Dispose()
解决的问题,我想添加一个简单的解决scheme,使我的一天,即通过增加默认2的ServicePointManager.DefaultConnectionLimit
。
“DefaultConnectionLimit属性设置创buildServicePoint对象时,ServicePointManager对象分配给ConnectionLimit属性的默认最大并发连接数。”
在我的情况下,我的应用程序成功地连接到我的远程服务2次,在第三次尝试它根本没有尝试连接到服务。 相反,它等待了一段时间,然后在上面的问题中出现相同的错误信息。 增加DefaultConnectionLimit
解决了这个问题。 为了增加挫败感,这种行为有点随机 – 在一个10的情况下,web服务被成功调用了多次(> 2)次。
解决scheme的起源和进一步讨论这两个线程: wcf-timeout-exception-detailed-investigation和wcf-service-throttling 。 解决了我的问题。