1

WCF で再帰的な MessageContract を使用できますか? 例えば ​​:

いくつかのパラメーターを投稿する必要があります。パラメーターの 1 つはファイル ストリームの配列です。これは私の OperationContract です:

DomainResult AddSomethingNew(int externalCustomerId, string domainName, bool isDefault, FileDataContract[] files);

ここに私の MessageContract があります:

[MessageContract]
public class FileDataContract
{        
    [MessageHeader(MustUnderstand=true)]
    public int ExternalCustomerId { get; set; }

    [MessageHeader(MustUnderstand=true)]
    public string DomainName{get;set;}

    [MessageHeader(MustUnderstand=true)]
    public bool IsDefault{get;set;}

    [MessageBodyMember(Order=1)]
    public FileUploadInputParameter[] Files { get; set; }
}

[MessageContract]
public class FileUploadInputParameter
{
    [MessageHeader(MustUnderstand = true)]
    public string FileName { get; set; }

    [MessageHeader(MustUnderstand = true)]
    public decimal FileSize { get; set; }

    [MessageBodyMember(Order = 1)]
    public Stream FileStream { get; set; }
}

あなたの助けが必要..

4

2 に答える 2

3

継承を使用して、2 つのメッセージ コントラクト間の関係を定義できます。

[MessageContract]
public class FileUploadInputParameter
{
    [MessageHeader(MustUnderstand = true)]
    public string FileName { get; set; }

    [MessageHeader(MustUnderstand = true)]
    public decimal FileSize { get; set; }

    [MessageBodyMember(Order = 1)]
    public Stream FileStream { get; set; }
}

[MessageContract]
public class FileDataContract : FileUploadInputParameter
{        
    [MessageHeader(MustUnderstand=true)]
    public int ExternalCustomerId { get; set; }

    [MessageHeader(MustUnderstand=true)]
    public string DomainName{get;set;}

    [MessageHeader(MustUnderstand=true)]
    public bool IsDefault{get;set;}
}

説明したようにメッセージ コントラクトを定義することはFileDataContractできません。これは、メッセージ ヘッダーの配列を持つことができず、多くの場合、Stream が唯一の使用可能な body 要素であり、1 つだけである必要があるためです。したがって、複数のファイルを渡す必要がある場合は、圧縮 (zip) を実装して単一のストリームを送信する必要もあります。

于 2011-10-26T08:39:26.793 に答える
1

簡単な答え: いいえ、できません。メッセージ コントラクトは、SOAP メッセージの最上位の定義であり、作成できるものではありません。あなたの例では、Filesメンバーが本文にあるように定義していますが、そのプロパティの一部 ( FileNameFileSize) はヘッダーにあり、一貫していません。試してみると、エラーが表示されない方法で「機能する」ことさえありますが、WCF がFileUploadInputParameter型を POCO シリアル化可能な型として扱うためです。

于 2011-10-26T16:08:02.430 に答える