(初学者)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
。
由于您将TimeOut
和MessageSize
设置为非常大的数字,我怀疑这实际上是消息序列化的问题。特别是在创建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:套接字连接中止的主要内容,如果未能解决你的问题,请参考以下文章
套接字连接被中止 - CommunicationException