【问题标题】:WCF server method - returning DataSet kills output parametersWCF 服务器方法 - 返回 DataSet 会杀死输出参数
【发布时间】:2009-12-13 15:55:07
【问题描述】:

寻找一些集体智慧。这是情况。这是使用 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 参数,我们需要做一些特殊的事情吗?有人遇到过类似的吗?

谢谢!!!!

【问题讨论】:

  • netTcpBinding 正在使用二进制序列化程序。您显示的跟踪是 XML。另一个奇怪的事情是客户端操作被标记为XmlSerializerFormatAttribute,这意味着服务契约也被标记了这个属性,它指示WCF使用XmlSerializer而不是默认的DataContractSerializer
  • 谢谢达林。这已经解决了,将发布一个单独的答案。

标签: wcf wcf-client


【解决方案1】:

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

DataContractSerializer 仅共享类型而非合约。增加了对XML读写器的支持,只根据schema捕获状态,deos不支持IFormatter。

所有这些都是我从 Juval Lowry 学习的 WCF 课程中学习的 :)

理查德

【讨论】:

    【解决方案2】:

    我的合约界面顶部有[XmlSerializerFormat]。删除它可以解决问题,因为 WCF 开始使用默认的 [DataSerializerFormat]。感谢达林指出。

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

    【讨论】:

      猜你喜欢
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 2012-07-02
      相关资源
      最近更新 更多