WCF服务器方法 - 返回DataSet会终止输出参数

时间:2009-12-13 15:55:07

标签: wcf wcf-client

寻找一些集体智慧。情况就是这样。这是使用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生成,看似正确。

  4. 问题:

    someStuff在客户端始终为空。

    观察:

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

      public string ExecuteQuery(out string someStuff) ...
      
    3. 完全删除客户端代理并重新生成它无济于事。

    4. 客户端肯定会收到DataSet和“out”字符串,如跟踪日志中所示:
    5. <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
      3. 为了返回DataSet和out参数,我们是否需要做任何特殊操作?有人遇到过类似的东西吗?

        感谢!!!!

2 个答案:

答案 0 :(得分:0)

我的合约界面顶部有[XmlSerializerFormat]。删除它解决了问题,因为WCF使用默认的[DataSerializerFormat]启动。感谢Darin指出它。

仍然不确定为什么XmlSerializerFormat无效。

答案 1 :(得分:0)

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

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

我从我的WCF课程中拿走了我从Juval Lowry那里获得的所有内容:)

理查德