3

次のコマンドを使用して、SilverlightクライアントからファイルをアップロードしようとしていますMessageContract

[MessageContract]
public class CategoryClientFileTransferMC : IDisposable
{
    /// <summary>
    /// CategoryID - Category identity.
    /// </summary>
    [MessageHeader(MustUnderstand = true)]
    public int CategoryID;

    /// <summary>
    /// ID - File identifier.
    /// </summary>
    [MessageHeader(MustUnderstand = true)]
    public string ID;

    /// <summary>
    /// Length - File length in bytes.
    /// </summary>
    [MessageHeader(MustUnderstand = true)]
    public long Length;

    /// <summary>
    /// FileByteStream - File stream.
    /// </summary>
    [MessageBodyMember(Order = 1)]
    public Stream FileByteStream;

    /// <summary>
    /// Dispose the contract.
    /// </summary>
    public void Dispose()
    {
        if (FileByteStream != null)
        {
            FileByteStream.Close();
            FileByteStream = null;
        }
    }
}

私の問題は、クライアントで生成された操作メソッドが1つの引数しか受け取らないことです。と呼ばれるバイト配列FileByteStream。私が作成した他の(Silverlight以外の)クライアントでは、MemberHeaderフィールドも要求されます。これらのヘッダーを指定しないと、サーバーはファイルをどう処理するかわかりません。操作を呼び出すときにこれらのヘッダーを設定するにはどうすればよいですか?

また、Silverlightクライアントからファイルをアップロードするためのより良い方法はありますか?これは大きな頭痛の種です。

ありがとう。

4

1 に答える 1

3

[MessageHeader]WCFクライアントのSilverlightサブセットは、属性をサポートしていません。メッセージヘッダーを設定することはできますが、他のプラットフォームほど簡単ではありません。基本的に、以下の例のように、呼び出しを行う前に、操作コンテキストを使用してヘッダーを設定する必要があります。

var client = new SilverlightReference1.MyClient();
using (new OperationContextScope(client.InnerChannel))
{
    string contractNamespace = "http://tempuri.org/";
    OperationContext.Current.OutgoingMessageHeaders.Add(
        MessageHeader.CreateHeader("CategoryId", contractNamespace, 1));
    OperationContext.Current.OutgoingMessageHeaders.Add(
        MessageHeader.CreateHeader("ID", contractNamespace, "abc123"));
    OperationContext.Current.OutgoingMessageHeaders.Add(
        MessageHeader.CreateHeader("Length", contractNamespace, 123456L));
    client.UploadFile(myFileContents);
}

メッセージヘッダーフィールドのXML名前空間はどこにありますかcontractNamespace(IIRCではデフォルトでサービスコントラクトと同じになります)。FiddlerやWCFテストクライアントなどを使用して、そこで使用されている名前空間を確認できます。

于 2012-12-18T23:53:32.207 に答える