CommunicationException was unhandled by user code
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 '02:48:04.9840000'.
我几个月来一直在测试这个应用程序,并且在对其中一个服务进行了一些小改动之后才看到这个错误。它只有几秒钟,所以我不认为这是一个超时问题。
InnerException:System.IO.IOException:读取操作失败,请参阅内部异常
(Inner)InnerException:System.Net.Sockets.SocketException - 远程主机强行关闭现有连接。
非常感谢任何建议!
提前致谢
答案 0 :(得分:9)
通常,当对方没有干净地关闭连接时,我看到了这个错误。如果在客户端,你必须从继承的类ClientBase<T>
那么你应该叫Close
当您正在使用的服务(实际上ClientBase<T>
工具IDisposable
所以你可以使用完毕using
声明。
如果使用的是ChannelFactory<T>
创建到该服务的结果,连接是实现了合同,但是也器具ICommunicationObject
的代理;完成后,你应该对此致电Close
。
在服务端,事情并不相同,会话(以及底层套接字)由客户端管理。如果服务正在丢失套接字,那很可能是错误的结果,在这种情况下,Music Magi的建议很好。微软谈论如何解决这个问题{。{3}}。
请注意,要清楚了解正在发生的事情,您可能需要为客户端和服务设置跟踪。要查看跟踪,您可以使用SvcTraceViewer
或Program Files\Microsoft SDKs\Windows\v6.0A\bin
文件夹中的Program Files\Microsoft SDKs\Windows\v7.0A\bin
。如果你有跟踪客户端和您可以在共同开启这两个文件的服务SvcTraceViewer
使用File / Add
菜单。
答案 1 :(得分:4)
您最有可能遇到配额问题,例如绑定中定义的MaxReceivedMessageSize,MaxArrayLength,MaxStringContentLength。
您还可以查看行为中可用的MaxItemsInObjectGraph属性。
答案 2 :(得分:2)
就我而言,在响应对象中添加了一个枚举,但是用于填充该对象的存储过程没有从数据库返回值。它正在返回其默认值(为零),该默认值对于所创建的枚举不是有效值。例如:
using System;
namespace Playground
{
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine((int)new SomeResponse().Enum);
Console.ReadLine();
}
public enum SomeEnum
{
Value1 = 1,
Value2 = 2,
Value3 = 3
}
public class SomeResponse
{
public SomeEnum Enum { get; set; }
}
}
}
您将看到枚举的值为零,即使没有枚举值为零。
如果尝试从WCF调用返回SomeResponse对象,并且该对象具有此状态,则最终将得到与问题中所述相同的错误。
答案 3 :(得分:0)
在我的情况下,我返回的是在Stream上带有using子句的Stream。在发送之前关闭流,并创建连接异常中止错误。
答案 4 :(得分:0)
就我而言,我们有两个系统-remoteSystem
和clientSystem
dev.clientSubsystem.acme
证书进行身份验证起初怀疑是防火墙,但是通过测试进行了消除
Test-NetConnection -Port 808 -ComputerName dev.remote-system.acme-corp.net-InformationLevel Detailed
原来是当clientSystem配置为使用其私有持有的证书(dev.clientSubsystem.acme
)进行身份验证但该证书不存在,或者在我们的示例中引用了错误的证书进行身份验证时,才出现此错误。
<system.serviceModel>
<client>
<endpoint name="RemoteSystemService" address="net.tcp://dev.remote-system.acme-corp.net:808/service.svc" behaviorConfiguration="remoteSystemNetTcpBindingBehavior" binding="netTcpBinding" contract="AcmeCorp.RemoteSystem.IRemoteSystemService">
<identity>
<dns value="dev.remote-system.acme" />
</identity>
</endpoint>
</client>
<bindings>
<netTcpBinding>
<binding>
<security mode="Transport">
<transport clientCredentialType="Certificate" protectionLevel="EncryptAndSign" />
</security>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="remoteSystemNetTcpBindingBehavior">
<clientCredentials>
<clientCertificate findValue="CN=dev.clientSubsystem.acme" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectDistinguishedName" />
<serviceCertificate>
<authentication certificateValidationMode="PeerTrust" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>