2

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 がバッファリングされることを期待します。

これはバグではありませんか?

4

1 に答える 1