log4net - 会社の制限を使用してすべての http トラフィックをログに記録したい場所から、グローバルな requestfilter があります。問題は、InputStream が常に長さ = 0 であることです。soap エンベロープは正しく逆シリアル化され、サービスの実行は成功しますが、最初のシリアル化後に入力ストリームを使用できません。すべての着信および発信 http トラフィックをログに記録したい場合、このアプローチは間違っていますか? これを達成するにはどうすればよいですか?逆シリアル化された requestDto をログに記録したくありません。
this.RequestFilters.Add((httpReq, httpResp, requestDto) =>
{
LogManager.LogFactory.GetLogger(this.GetType()).Info(httpReq.GetRawBody());
});
メソッドのタイプ ServiceStack.WebHost.Endpoints.Support.SoapHandler でエラーが発生したようです。 using ステートメントは、ストリームをバッファリングせずに閉じます。
protected static Message GetRequestMessage(Stream inputStream, MessageVersion msgVersion)
{
using (var sr = new StreamReader(inputStream))
{
var requestXml = sr.ReadToEnd();
var doc = new XmlDocument();
doc.LoadXml(requestXml);
var msg = Message.CreateMessage(new XmlNodeReader(doc), int.MaxValue,
msgVersion);
return msg;
}
}
タイプ ServiceStack.WebHost.Endpoints.Extensions で GetRawBody にアクセスしようとすると、次のロジックが実行されます。
public string GetRawBody()
{
if (bufferedStream != null)
{
return bufferedStream.ToArray().FromUtf8Bytes();
}
using (var reader = new StreamReader(InputStream))
{
return reader.ReadToEnd();
}
}
ここでは、Inputstream が使用できなくなったため (長さ = 0)、inpustream がバッファリングされることを期待します。
これはバグではありませんか?