私は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;
}
- Envelop 要素で最高潮に達する完全な SOAP メッセージを取得するにはどうすればよいですか。
- クライアントで作成された byte[] でさえ、値がありません。私がしてきたことの何が悪いのですか?
期待してありがとう..