WCF:套接字连接已中止

时间:2010-10-21 18:25:35

标签: c# wcf service

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 - 远程主机强行关闭现有连接。

非常感谢任何建议!

提前致谢

5 个答案:

答案 0 :(得分:9)

通常,当对方没有干净地关闭连接时,我看到了这个错误。如果在客户端,你必须从继承的类ClientBase<T>那么你应该叫Close当您正在使用的服务(实际上ClientBase<T>工具IDisposable所以你可以使用完毕using声明。

如果使用的是ChannelFactory<T>创建到该服务的结果,连接是实现了合同,但是也器具ICommunicationObject的代理;完成后,你应该对此致电Close

在服务端,事情并不相同,会话(以及底层套接字)由客户端管理。如果服务正在丢失套接字,那很可能是错误的结果,在这种情况下,Music Magi的建议很好。微软谈论如何解决这个问题{。{3}}。

请注意,要清楚了解正在发生的事情,您可能需要为客户端和服务设置跟踪。要查看跟踪,您可以使用SvcTraceViewerProgram 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)

就我而言,我们有两个系统-remoteSystemclientSystem

  • 两个系统都有其公共/专用证书进行身份验证。
  • 每个系统都有自己的私钥,而对等的公钥。
  • 客户端使用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>