寻找一些集体智慧。这是情况。这是使用Visual Studio 2008WCF服务器方法 - 返回DataSet杀死输出参数
我们有一个简单的WCF合同露出下面的方法:
DataSet ExecuteQuery (out string someStuff);
此方法实现:
public DataSet ExecuteQuery (out string someStuff) { someStuff = "abc"; return new DataSet(); // simplified }
客户端代理由svcutil生成,看起来是正确的。
问题:
someStuff
总是在客户端空。
观察:显示在我们的构建机器上
- 同样的问题。
返回一个字符串,而不是数据集,使客户端代理收到了参数的正确值:
public string ExecuteQuery(out string someStuff) ...
完全删除客户端代理和再生它并不能帮助。
- 客户端明确地同时接收数据集和 “出” 的字符串,如在它的跟踪日志:
<ExecuteQueryResponse xmlns="http://tempuri.org/"> <ExecuteQueryResult> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"></xs:choice> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"></diffgr:diffgram> </ExecuteQueryResult> <someStuff>abc</someStuff> </ExecuteQueryResponse>
下面是如何在客户端代理生成代码:
[System.ServiceModel.OperationContractAttribute (Action="http://tempuri.org/IQueryContract/ExecuteQuery", ReplyAction="http://tempuri.org/IQueryContract/ExecuteQueryResponse")] [System.ServiceModel.XmlSerializerFormatAttribute()] System.Data.DataSet ExecuteQuery(out string someStuff);
- 我们使用NetTcpBinding的
我们是否需要做任何特殊的事情才能返回DataSet和输出参数?任何人都遇到过类似的东西?
谢谢!
'netTcpBinding'使用二进制序列。您显示的跟踪是XML。另一个奇怪的问题是,客户端操作被标记为'XmlSerializerFormatAttribute',这意味着服务契约也被标记了这个属性,它指示WCF使用'XmlSerializer'而不是默认的'DataContractSerializer'。 – 2009-12-13 16:24:21
谢谢Darin。这已经解决了它,会发布一个单独的答案。 – Daniel 2009-12-13 17:38:53