我正在用C#创建一个远程管理库存的应用程序。
我的客户端 - 服务器通信工作,我可以交换一些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();
非常感谢任何建议。 提前致谢
答案 0 :(得分:1)
虽然我非常同意@Lucas的观点,但为了避免在DataTable
中尽可能使用WCF
,我会建议一个可能的问题解决方案,以防你必须使用{{1}由于某些原因。
由于您将DataTable
和TimeOut
设置为非常大的数字,我怀疑这实际上是序列化消息的问题。特别是,如果在创建MessageSize
时未设置DataTable
的名称,则会出现此问题。
public DataTable MyServiceMethod()
{
DataTable dataTable = new DataTable();
// populate dataTable;
return dataTable;
}
如果您正在创建数据表,则可能无法序列化,而是需要为dataTable
DataTable dataTable = new DataTable("myDataTable);
答案 1 :(得分:0)
停止使用DataTable
。是的,真的:它们很难用,所以为什么要这么麻烦?最重要的是,你失去了强大的打字能力。
更严重的是,这是因为WCF需要事先知道邮件的格式,并且松散键入的值不会使用默认的序列化程序(DataContractSerializer
)。
所以你可以将序列化器切换到NetDataContractSerializer
,这应该能够处理这种情况(我从未用DataTable
测试它,但我想它可以工作)。
或者更好的解决方案:创建一个自己的对象(强类型),代表行并返回一个列表。