1
私の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));
}
}
}
としては、これが現在取り組んでいるが、私はそれを解放するのが怖い、と述べました。だから、あなたは身体ですべてのリクエストを記録するより良い方法を持っているかもしれません。
私が望んでいたまさに:あなたはリクエストボディのバッファリングを可能にすると
LimitToServiceRequests=false
を設定することも例えば、非サービス要求を記録しますどのEnableRequestBodyTracking=true
の要求本体を記録することができます。 –