就在最近,我开始研究WCF流的棘手问题,如果客户端在发送到服务器之间等待的时间超过130秒,则会产生CommunicationException.
以下是完整的例外情况:
System.ServiceModel.CommunicationException was unhandled by user code
HResult=-2146233087
Message=The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '23:59:59.9110000'.
Source=mscorlib
StackTrace:
Server stack trace:
at System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.WebRequestOutputStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.BufferedStream.Write(Byte[] array, Int32 offset, Int32 count)
at System.Xml.XmlStreamNodeWriter.FlushBuffer()
at System.Xml.XmlStreamNodeWriter.GetBuffer(Int32 count, Int32& offset)
at System.Xml.XmlUTF8NodeWriter.InternalWriteBase64Text(Byte[] buffer, Int32 offset, Int32 count)
at System.Xml.XmlBaseWriter.WriteBase64(Byte[] …Run Code Online (Sandbox Code Playgroud) 我有一个WCF服务,在负载条件下给我这个错误(我似乎无法重新创建错误).我们一直试图找到解决方法大约一个星期,现在没有这样的运气..
我看到的错误有两个部分,
System.ServiceModel.CommunicationException:通过http通道传输数据时发生错误:(请求已中止:请求已取消.)
和:
System.Net.WebException:请求已中止:请求已取消.
我见过很多人建议通过重载Reference.cs文件和设置中的方法来禁用处于保持活动状态KeepAlive = false,但是,我们的客户端正在使用服务引用(除了Web引用)并且此选项不再存在.
我看到的另一个选项是向服务添加自定义绑定而不是BasicHttpBinding我们现在使用的,但是这会对那些使用webReference的人(因为CustomBinding没有启用SOAP)的后端支持Web服务.
有没有人以前处理过这个错误?有没有办法在不影响服务器端的情况下禁用WCF中的keep alive?是否还有其他任何可以导致此错误的活着?
.net wcf service-reference system.net.webexception communicationexception
所以问题是WCF4是否调用客户端连接池到WCF服务?例如,我们将ASP .NET应用程序作为客户端和服务(在不同的机器上).然后在代码中的某处我们有类似的东西:
ServiceClient client = new ServiceClient();
// Here some work with service goes...
Run Code Online (Sandbox Code Playgroud)
假设我们在两段代码中都有另一个服务调用:
ServceClient client2 = new ServiceClient();
// Another one processing...
Run Code Online (Sandbox Code Playgroud)
那么client2连接会从连接池中获取吗?
我有一个Silverlight客户端在IIS Web服务器上调用WCF服务.它使用默认的basicHttpBinding设置进行调用.我的客户端代码具有使用"更新服务引用"菜单选项时生成的常见Visual Studio生成的代理.
使用该代理对服务的每次调用都使用相同的连接吗?或者每次拨打电话时是否创建连接,然后在收到回复后将其关闭?由于客户端实际上通过HTTP进行SOAP调用,我只是假设每个服务请求都创建了一个新连接,但我想检查是否是这种情况?
(我需要知道,因为如果它每次创建一个新连接,那么每个请求都可能最终在不同的服务器上,因为有几个服务器负载均衡.它在代理的持续时间内使用单个连接然后我可以假设它们所有这些都最终在同一台机器上,因此缓存状态信息以获得更好的性能.)