2014-09-27 76 views
0

我正在用C#创建一个应用程序,用于远程管理股票。(初学者)C#/ WCF:套接字连接中止

我的客户端 - 服务器通信有效,我可以交换一些String,bool,int等。但是我无法从服务器获取DataTable或其他类型的对象。目前我使用我的数据库中的少量数据进行测试,服务器在客户端调用函数时设法读取数据,但客户端不接收函数return(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(); 

任何建议都非常赞赏。 在此先感谢

+0

能否请你添加一些代码,你如何构建并在'WCF'服务中返回'DataTable',还有你的调用'WCF'服务的客户端代码? – Michael 2014-09-27 11:09:51

回答

0

停止使用DataTable。是的,真的:他们是一个痛苦的使用,所以为什么要麻烦?最重要的是,你失去了强大的打字能力。

更严重的是,这是由于WCF需要事先知道消息的格式,松散类型的值不会使用默认串行器(DataContractSerializer)。所以你可以将串行器切换到NetDataContractSerializer,这应该能够处理这种情况(我从来没有用DataTable测试过,但我认为它可以工作)。

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

0

虽然我强烈@Lucas意见分歧,避免使用DataTable,只要你能在WCF,我会建议一个可能的解决问题的方法,如果你有使用DataTable因为某些原因。 由于您将TimeOutMessageSize设置为非常大的数字,所以我怀疑这实际上是邮件序列化的问题。特别是,如果在创建时未设置DataTable的名称,则会出现此问题。

public DataTable MyServiceMethod() 
{ 
    DataTable dataTable = new DataTable(); 
    // populate dataTable; 
    return dataTable; 
} 

如果这是你如何创建数据表,它可能无法序列化,而不是你需要给一个名字dataTable

DataTable dataTable = new DataTable("myDataTable);