1

私はWCFの内部を理解しようとしています。カスタム フォーマッタとメッセージ インスペクタを作成しようとしました (クライアントとサーバーの両方で、いくつかのオンライン リンクをたどって) が、問題に直面しています。サーバーでの私の operationcontract メソッドは、単にファイル ( 「テスト」テキストが含まれている) を読み取り、ファイルストリームを返します。次に、カスタム ディスパッチ フォーマッタが、メッセージとして受信したストリームをシリアル化しようとします。以下は、サーバーでのカスタムシリアライザーメソッドの定義です-

        public System.ServiceModel.Channels.Message SerializeReply(System.ServiceModel.Channels.MessageVersion messageVersion, object[] parameters, object result)
    {
        string content;
        using(var reader = new StreamReader(((FileStream)result), Encoding.ASCII))
        { content = reader.ReadToEnd(); }
        Message message = Message.CreateMessage(messageVersion, "http://tempuri.org/IService1/GetStreamVideoResponse", new CustomBodyWriter(content));
        return message;
    }

CustomBodyWriter は次のように実装されています -

class CustomBodyWriter : BodyWriter
{
    string content;
    public RawBodyWriter(string content)
        : base(true)
    {
        this.content = content;
    }

    protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
    {
        writer.WriteStartElement("GetStreamVideoResponse");
        writer.WriteAttributeString("xmlns", "http://tempuri.org/");
        writer.WriteStartElement("GetStreamVideoResult");
        writer.WriteString(content);
        writer.WriteEndElement();
    }
}

CustomBodyWriter の OnWriteBodyContents メソッドで xml を記述すると、xmldictionarywriter がエンベロープをオーバーライドすると思います。しかし、どうすれば応答要素を適切に挿入できますか..

BeforeSendReply メソッドで送信された返信を出力するためだけにカスタム Inspector に接続すると、コンソールに次の出力が表示されます (終了エンベロープ要素がありません)-

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w
3.org/2003/05/soap-envelope">
  <s:Header>
    <a:Action s:mustUnderstand="1">http://tempuri.org/IService1/GetStreamVideoRe
sponse</a:Action>
    <ActivityId CorrelationId="0e0a6aae-91fa-4f9d-94b2-8c390cb5493d" xmlns="http
://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">e452a645-e8c5-44bf-81
06-d821522b7883</ActivityId>
    <a:RelatesTo>urn:uuid:72b789cb-cc0b-48ac-b73a-434040434ce1</a:RelatesTo>
  </s:Header>
  <s:Body>
    <GetStreamVideoResponse xmlns="http://tempuri.org/">
      <GetStreamVideoResult>**testing**</GetStreamVideoResult>
    </GetStreamVideoResponse>
  </s:Body>

クライアントで、メッセージの本文部分をバイト[]で読み取り、その上にファイルストリームを作成して返すだけで、メッセージを逆シリアル化しようとするカスタムインスペクターを作成しました-

public object DeserializeReply(System.ServiceModel.Channels.Message message, object[] parameters)
{
    var getBody = message.GetReaderAtBodyContents();
    byte[] buffer = getBody.ReadContentAsBase64();
    FileStream fs = new FileStream("c:\\test.txt", FileMode.OpenOrCreate);//not ideal but need for         testing at present
    fs.Write(buffer, 0, buffer.Length);
    return fs;
}
  1. Envelop 要素で最高潮に達する完全な SOAP メッセージを取得するにはどうすればよいですか。
  2. クライアントで作成された byte[] でさえ、値がありません。私がしてきたことの何が悪いのですか?

期待してありがとう..

4

0 に答える 0