我使用的绑定是NetTcpBinding(通过互联网),所有并发内容和maxconnection设置为高值(4000 maxconnection,concurrent,等等),因此限制设置得非常高,并且事实来自wcf服务器的性能计数器我可以看到没有一个并发计数器已满,但是......但我遇到了一个超时噩梦描述如下:
“超时仅定义了您必须等待服务实际失败并给出错误的时间,但修改此超时的值对成功的可能性没有影响。基本上,在第一次发生时会发生一些事情第二个服务请求搞砸了。它永远不会恢复.WCF不会为你神奇地重试网络连接。很好,有时建立一个网络连接不顺利。但是,如果你的超时是2小时,你必须要等待整整2个小时才能完成工作才能最终确认它不起作用并给你错误。“
我从this thread获取了上述描述,这正是我遇到的问题。
运营商每天执行相同的操作一千次和几千次,有时他们会接受超时错误,即使他们能够在没有任何延迟的情况下快速执行相同的操作,同时有人正在获得超时,与另一个客户端实例相同的计算机,他们可以拨打电话,而且速度很快!并检查服务器端的错误没有记录在服务实现中,并且没有任何内容存储在数据库中,因此请求从未调用过这些方法,所以我绝对在调用初始化期间考虑一些错误,可能是身份验证,令牌化,cripting或该层中的某些内容,但我找不到任何血腥的错误消息(可能启用wcf跟踪?)。
无论如何,事实是我们使用普通的http客户端 - 服务器请求获得了经典asp中编写的旧软件,并且这个问题永远不会发生,如果我们谈论相同的互联网连接,那么我必须思考什么? Internet Explorer在遇到错误时会制作一些神奇的东西吗? WCF得到了一些隐藏配置,我可以设置以改善这种行为?我可以说的是,我试图在WsHttpBinding中配置我们的wcf服务,这种超时接缝永远不会发生,即使我们仍然遇到一些错误,但连接立即释放,即使连接是相当的与tcp连接相同,因为默认情况下wshttpbinding配置为保持tcp通道,但我仍然不明白为什么使用tcp我会得到这种超时。
如果有人可以帮助我,我将非常感激!
谢谢!
答案 0 :(得分:1)
这个问题与硬件坏了有关,而且调试真的很难,还有wireshark(tcp sniffer)数据包没有显示任何特定错误,我们发现了一些tcp重试,这可能是一个症状,但实际上数据包只是卡在调制解调器 - 路由器内部的某个地方,这是一个电信调制解调器(倍耐力门2加),改变调制解调器/路由器后,问题完全消失。
无论如何,我们发现wsHttpBinding over http,对于没有控制权的互联网连接更可靠,而且你无法确定网站上安装了什么硬件。
希望这也有助于其他人:)
答案 1 :(得分:0)
我们遇到了同样的问题但是使用了WsHTTPBinding。您可以通过在循环中调用相同的操作来模拟上述方案,而无需显式关闭客户端连接。 要避免出现此问题,请检查在每个操作完成时是否显式关闭客户端连接,否则请求将在服务器上堆积。将客户端显式关闭为client.Close()。
这将消除服务器中请求的堆积并提高应用程序的性能。