WCF停止响应约10左右的电话(节stream)

我有一个WCF服务和一个带有服务引用的应用程序,在应用程序中我有一个循环,每次迭代都会调用这个wcf web服务中的方法。

问题是,大约9个电话后,它只是停止…,如果你打VS的Pausebutton,你会看到它卡在线路,它打电话。

等待一段时间后,这个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(关于usingvariables赋值):

我通常会将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 。 解决了我的问题。