user2237815
user2237815

Reputation: 43

ServiceStack: httpReq.GetRawBody() is empty

I have a global requestfilter from where i want to log all http traffic using log4net - company restriction. Problem is that the InputStream is always lenght = 0. The soap envelope is desezerialized correctly and execution of service is succesfull, but inputstream is unavailable after first serialization. Is this wrong approach, if i want to log all ingoing and outgoing http traffic? What should i do to accomplish this? I do not want to log the deserialized requestDto.

this.RequestFilters.Add((httpReq, httpResp, requestDto) =>
{
    LogManager.LogFactory.GetLogger(this.GetType()).Info(httpReq.GetRawBody());
});

Error seems to occur in type ServiceStack.WebHost.Endpoints.Support.SoapHandler in method, where using statement closes stream without buffering it:

 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;
        }
    }

When i try to access GetRawBody on type ServiceStack.WebHost.Endpoints.Extensions the following logic is executed:

 public string GetRawBody()
    {
        if (bufferedStream != null)
        {
            return bufferedStream.ToArray().FromUtf8Bytes();
        }

        using (var reader = new StreamReader(InputStream))
        {
            return reader.ReadToEnd();
        }
    }

Here I would expect the inpustream to be buffered, since it Inputstreaem is no longer available (lenght = 0).

Isn't this a bug?

Upvotes: 2

Views: 481

Answers (1)

paaschpa
paaschpa

Reputation: 4816

Have you seen Request Logger or IRequiresRequestStream. These might help provide some insight on logging requests. Also, I don't believe InputStream would have a length on GET requests.

Upvotes: 1

Related Questions