2009-12-13 39 views
1

寻找一些集体智慧。这是情况。这是使用Visual Studio 2008WCF服务器方法 - 返回DataSet杀死输出参数

  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. 返回一个字符串,而不是数据集,使客户端代理收到了参数的正确值:

    public string ExecuteQuery(out string someStuff) ... 
    
  3. 完全删除客户端代理和再生它并不能帮助。

  4. 客户端明确地同时接收数据集和 “出” 的字符串,如在它的跟踪日志:

<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和输出参数?任何人都遇到过类似的东西?

    谢谢!

    +0

    'netTcpBinding'使用二进制序列。您显示的跟踪是XML。另一个奇怪的问题是,客户端操作被标记为'XmlSerializerFormatAttribute',这意味着服务契约也被标记了这个属性,它指示WCF使用'XmlSerializer'而不是默认的'DataContractSerializer'。 – 2009-12-13 16:24:21

    +0

    谢谢Darin。这已经解决了它,会发布一个单独的答案。 – Daniel 2009-12-13 17:38:53

    回答

    0

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

    还不确定为什么XmlSerializerFormat不起作用。

    0

    由SOA定义的WCF不得传输对象(状态和行为),仅传输对象的状态和结构。的BinaryFormatter和SoapFormatter不足以进行SOA因为: 1)需要两端共享型 2)不能被用于合同 3)都需要格式化流

    的DataContractSerializer没有给全体类型不合同。它增加了对XML阅读器和编写器的支持,只根据模式捕获状态,而且不支持IFormatter。

    所有这一切,我从我的WCF当然,我从Juval洛瑞了:)

    理查德带着

    相关问题