3

ストリームを含む別のMessageContractを含むMessageContractでWCFを使用してファイルをストリーミングすることは可能ですか?答えはノーだと思いますが、いわば「ルート」メッセージ内にファイルをパッケージ化したいと思います。

言い換えれば、私のセットアップは次のようになります。

[MessageContract]
public class Transport
{
    [MessageHeader]
    private readonly Guid fId;

    [MessageHeader]
    private readonly DateTime fTimestamp;

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

[MessageContract]
public class FileTransferMessage : IDisposable
{
    [MessageBodyMember(Order = 1)]
    public Stream FileByteStream;

    [MessageHeader(MustUnderstand = true)]
    public long FileLength;

    [MessageHeader(MustUnderstand = true)]
    public string FileName;
}

リクエストはサービスに正常に送受信されますが、ストリームが適切に逆シリアル化されておらず、null参照として返されているようです。ストリーミングを使用したMessageContractで、StreamはMessageContractの本体でなければならないというルールをどこかで読んだことがありますが、それが現在違反していると思います。FileTransferMessageがBodyであり、次にStreamがBodyであることが受け入れられることを期待していました。

私がここで何ができるかについて誰か提案がありますか?Stream / FileName/FileLengthをTransportオブジェクトに追加したくありません。

4

1 に答える 1

3

MessageContractを設計するチームの一員として、答えはノーだと言えます:) MessageContractは完全なSOAPメッセージを1つだけ表し、相互にネストすることはできません(例のFileTransferMessageは単純にシリアライザーは、[MessageContract]属性について何も知らず、それを無視し、特別なStreamの動作についても何も知りません)。

カスタムメッセージサブクラス(またはカスタムストリームサブクラス)を作成する以外に、私は良い解決策を考えることができません。fIdとfTimestampがすべてのメッセージにある場合は、カスタムメッセージインスペクターを使用してこれらを挿入し、操作でFileTransferMessageを使用することを検討してください。

ここでの信頼できるドキュメントは、http://msdn.microsoft.com/en-us/library/ms730255.aspxおよびhttp://msdn.microsoft.com/en-us/library/ms733742.aspxです

于 2012-10-09T22:43:39.977 に答える