我有一个全局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)。
这不是一个错误吗?
答案 0 :(得分:1)
您是否见过Request Logger或IRequiresRequestStream。这些可能有助于提供有关记录请求的一些信息另外,我不相信InputStream会对GET请求有一个长度。