【发布时间】:2017-10-22 12:34:08
【问题描述】:
我想记录我的ServiceStack AppHost 尝试处理的每一个 HTTP 请求。我想出了一个不错的解决方案,但我不知道这是否会在某个地方爆炸,因为我将MemoryStream 注入到HttpListenerRequest,因为InputStream 不会让我回头。
我的日志
public static void R(HttpListenerRequest request)
{
var guid = Guid.NewGuid().ToString().Replace("-", "");
L(LogType.Request, "{1} Url: {0} LocalEndPoint: {2} RemoteEndPoint: {3}", request.Url, request.HttpMethod, request.LocalEndPoint.ToString(), request.RemoteEndPoint.ToString());
foreach (var header in request.Headers.AllKeys)
{
Trace.WriteLine(string.Format("{0} H {1}: {2}", (char)LogType.Request, header, request.Headers[header]));
}
string content = null;
if (request.InputStream != null)
{
MemoryStream memStream = new MemoryStream();
request.InputStream.CopyTo(memStream);
request.InputStream.Close();
request.InputStream.Dispose();
memStream.Position = 0;
var reader = new StreamReader(memStream);
{
content = reader.ReadToEnd();
memStream.Position = 0;
request.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Where(field => field.Name == "m_RequestStream")
.First()
.SetValue(request, memStream);
}
}
if (!string.IsNullOrEmpty(content))
{
foreach (var line in content.Split('\n'))
{
Trace.WriteLine(string.Format("{0} B {1}", (char)LogType.Request, line));
}
}
}
AppHost 内部
protected override Task ProcessRequestAsync(HttpListenerContext context)
{
var request = context?.Request;
if (request != null)
{
Log.R(request);
}
return base.ProcessRequestAsync(context);
}
如前所述,这目前正在运行,但我害怕发布它。因此,也许您有更好的方法来记录所有带有正文的请求。
【问题讨论】:
标签: c# servicestack httplistenerrequest