내 ServiceStack
AppHost
이 처리하려고하는 모든 HTTP 요청을 기록하려고합니다. 괜찮은 솔루션을 생각해 냈습니다.하지만 어도비가 어딘가에 폭발 할 수 있는지 알지 못합니다. 왜냐하면 MemoryStream
을 HttpListenerRequest
에 삽입하기 때문에 InputStream
은 저를 찾지 않을 것이기 때문입니다. AppHostAppHost 요청의 일반 로깅을 포함합니다. ServiceStack의 본체
protected override Task ProcessRequestAsync(HttpListenerContext context)
{
var request = context?.Request;
if (request != null)
{
Log.R(request);
}
return base.ProcessRequestAsync(context);
}
으로 내부
내 로그
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));
}
}
}
이 현재 작동하고,하지만 난 그것을 방출 두려워했다. 어쩌면 당신은 시체로 모든 요청을 로깅하는 더 좋은 방법을 얻었을 것입니다.
합니다. –