ServiceStack:httpReq.GetRawBody()为空

时间:2013-04-03 09:25:21

标签: servicestack

我有一个全局requestfilter,我希望使用log4net记录所有http流量 - 公司限制。问题是InputStream始终是lenght = 0. soap包被正确地去desezerialized并且服务的执行是成功的,但是在第一次序列化之后输入流是不可用的。这是错误的方法,如果我想记录所有进入和传出的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();
        }
    }

这里我希望缓冲inpustream,因为它不再具有Inputstreaem(lenght = 0)。

这不是一个错误吗?

1 个答案:

答案 0 :(得分:1)

您是否见过Request LoggerIRequiresRequestStream。这些可能有助于提供有关记录请求的一些信息另外,我不相信InputStream会对GET请求有一个长度。