2011-10-26 11 views
1

WCFで再帰的なMessageContractを使用できますか? 例:MessageContractをWCF内の他のコントラクトに配置する

パラメータを投稿する必要があります。パラメータの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; } 
} 

は、あなたの助け必要..

+0

私は何も再帰的に表示されません - あなたのサービス操作でメッセージ契約の配列が表示されますが、それは問題ありません。 – Tim

+0

私は残念です。Tim、別のMessageContractメンバーとしてMessageContractを使用できますか?私はそれのメンバーの1つが別のメッセージの配列であるmessagecontractが必要です.. –

+0

私の頭の上から私はなぜそうは見ません。私は100%あなたに確信を与えることはできませんし、あなたが答えることができないと確信することはできません。それが動作するかどうか試してみましたか? – Tim

答えて

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;} 
} 

メッセージ契約をお客様が指定することはできません。あなたはメッセージヘッダの配列を持つことができず、Streamよりも多くの場合、利用可能なbody要素は1つだけでなければならないので、FileDataContractにibedしてください。したがって、複数のファイルを渡す必要がある場合は、圧縮(zip)を実装して単一ストリームを送信する必要があります。

1

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

関連する問題