2

我有一个全局请求过滤器,我想使用 log4net 记录所有 http 流量 - 公司限制。问题是 InputStream 总是 lenght = 0。soap 信封正确反序列化并且服务执行成功,但第一次序列化后 inputstream 不可用。如果我想记录所有传入和传出的 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();
        }
    }

在这里,我希望输入流被缓冲,因为它 Inputstreaem 不再可用(长度 = 0)。

这不是一个错误吗?

4

1 回答 1

1

你见过 Request LoggerIRequiresRequestStream 吗?这些可能有助于提供有关日志记录请求的一些见解。另外,我不相信 InputStream 在 GET 请求上会有长度。

于 2013-04-05T05:02:46.533 回答