(初学者)C#/WCF:套接字连接中止

Posted

技术标签:

【中文标题】(初学者)C#/WCF:套接字连接中止【英文标题】:(beginner) C# / WCF: Socket connection aborted 【发布时间】:2014-11-22 07:20:24 【问题描述】:

我正在用 C# 为 Windows 创建一个远程管理库存的应用程序。

我的客户端-服务器通信正常,我可以交换一些 String、bool、int 等。但我无法从服务器获取 DataTable 或其他类型的对象。目前我用数据库中的少量数据进行测试,当客户端调用函数但客户端没有收到函数返回(DataTable)时,服务器设法读取数据。

这是我的错误信息:

套接字连接被中止。这可能是由于处理您的消息时出错或远程主机超出接收超时,或者是潜在的网络资源问题引起的。本地套接字超时为 '00:00:59.2590000'。

我的主人:

NetTcpBinding netTcpBinding = new NetTcpBinding();
netTcpBinding.MaxBufferSize = 10000000;
netTcpBinding.MaxReceivedMessageSize = 10000000;
netTcpBinding.CloseTimeout = TimeSpan.FromMinutes(10);
netTcpBinding.SendTimeout = TimeSpan.FromMinutes(10);
ServiceHost host = new ServiceHost(typeof(ServiceWCF));
host.AddServiceEndpoint(typeof(ISLM_serviceContract),
                    netTcpBinding,"net.tcp://localhost:10108/SLM_WCF");
host.Open();

非常感谢任何建议。 提前致谢

【问题讨论】:

能否添加一些代码,如何在WCF 服务中构造和返回DataTable,以及调用WCF 服务的客户端代码? 【参考方案1】:

虽然我非常同意@Lucas 的观点,但为了避免在WCF 中尽可能使用DataTable,我会建议一个可能的解决方案,以防您因某些原因必须使用DataTable。 由于您将TimeOutMessageSize 设置为非常大的数字,我怀疑这实际上是消息序列化的问题。特别是在创建DataTable的时候没有设置名字就会出现这个问题。

public DataTable MyServiceMethod()

   DataTable dataTable = new DataTable();
   // populate dataTable;
   return dataTable;

如果这是您创建数据表的方式,它可能无法序列化,您需要为 dataTable 命名

DataTable dataTable = new DataTable("myDataTable);

【讨论】:

【参考方案2】:

停止使用DataTable。是的,真的:它们使用起来很痛苦,那何必呢?最重要的是,你失去了强类型。

更严重的是,这是因为 WCF 需要事先知道消息的格式,而松散类型的值不适用于默认序列化程序 (DataContractSerializer)。

因此,您可以将序列化程序切换到NetDataContractSerializer,它应该能够处理这种情况(我从未使用DataTable 对其进行过测试,但我想它可以工作)。

或者更好的解决方案:创建一个您自己的对象(强类型),它代表一个并返回一个列表。

【讨论】:

以上是关于(初学者)C#/WCF:套接字连接中止的主要内容,如果未能解决你的问题,请参考以下文章

WCF 传输安全:套接字连接被中止

套接字连接被中止 - CommunicationException

WCF常见问题

工作组上的 WCF

***Error 然后 SocketException:软件导致连接中止:套接字写入错误 [重复]

java.net.SocketException:软件导致连接中止:套接字写入错误[重复]