1

寻找一些集体智慧。这是情况。这是使用 Visual Studio 2008。

  1. 我们有一个简单的 WCF 合约,它公开了以下方法:

    DataSet ExecuteQuery (out string someStuff);
    
  2. 该方法实现为:

    public DataSet ExecuteQuery (out string someStuff)
    {
        someStuff = "abc";
        return new DataSet(); // simplified
    }
    
  3. 客户端代理由 svcutil 生成,看起来是正确的。

问题:

someStuff在客户端始终为空。

观察:

  1. 同样的问题出现在我们的构建机器上。
  2. 返回一个字符串而不是 DataSet 使客户端代理接收正确的 out 参数值:

    public string ExecuteQuery(out string someStuff) ...
    
  3. 完全删除客户端代理并重新生成它没有帮助。

  4. 客户端肯定会同时收到 DataSet 和“out”字符串,如其跟踪日志所示:

<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>

  1. 以下是客户端代理生成代码的方式:

    [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);
    
  2. 我们使用 netTcpBinding

为了返回 DataSet 和 out 参数,我们需要做一些特殊的事情吗?有人遇到过类似的事情吗?

谢谢!!!!

4

2 回答 2

0

[XmlSerializerFormat]在合同界面的顶部。删除它解决了问题,因为 WCF 开始使用默认的[DataSerializerFormat]. 感谢达林指出。

仍然不确定为什么XmlSerializerFormat不起作用。

于 2009-12-13T17:40:38.897 回答
0

正如 SOA 所定义的,WCF 不能传输对象(状态和行为),只能传输对象的状态和结构。BinaryFormatter 和 SoapFormatter 不适用于 SOA,因为:1) 要求两端共享类型 2) 不能用于合约 3) 两个格式化程序都需要流

DataContractSerializer 只共享类型而不是合约。它增加了对 XML 读取器和写入器的支持,仅根据模式捕获状态,并且 deos 不支持 IFormatter。

我从 Juval Lowry 学习的 WCF 课程中学习的所有内容 :)

理查德

于 2009-12-15T23:09:41.137 回答