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クライアント側では常に null です。

所見:

  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 に答える