寻找一些集体智慧。情况就是这样。这是使用Visual Studio 2008。
我们有一个简单的WCF合同,公开以下方法:
DataSet ExecuteQuery (out string someStuff);
此方法实现为:
public DataSet ExecuteQuery (out string someStuff)
{
someStuff = "abc";
return new DataSet(); // simplified
}
客户端代理由svcutil生成,看似正确。
问题:
someStuff
在客户端始终为空。
观察:
返回字符串而不是DataSet使客户端代理接收到out参数的正确值:
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);
为了返回DataSet和out参数,我们是否需要做任何特殊操作?有人遇到过类似的东西吗?
感谢!!!!
答案 0 :(得分:0)
我的合约界面顶部有[XmlSerializerFormat]
。删除它解决了问题,因为WCF使用默认的[DataSerializerFormat]
启动。感谢Darin指出它。
仍然不确定为什么XmlSerializerFormat
无效。
答案 1 :(得分:0)
由SOA定义的WCF不得传输对象(状态和行为),只传输对象的状态和结构。 BinaryFormatter和SoapFormatter不适用于SOA,因为: 1)要求两端共享类型 2)不能用于合同 3)两个格式化程序都需要流
DataContractSerializer仅共享类型而非合约。它增加了对XML读取器和编写器的支持,只根据模式捕获状态,并且deos不支持IFormatter。
我从我的WCF课程中拿走了我从Juval Lowry那里获得的所有内容:)
理查德