【问题标题】:Generic logging of AppHost requests incl. bodies in ServiceStackAppHost 请求的通用日志记录,包括。 ServiceStack 中的实体
【发布时间】: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


    【解决方案1】:

    您可以使用这种方法,但我建议使用built-in Request Logger。您可以使用EnableRequestBodyTracking=true 记录请求正文,这将启用请求正文的缓冲,并且配置LimitToServiceRequests=false 也将记录非服务请求,例如:

    Plugins.Add(new RequestLogsFeature {
        EnableRequestBodyTracking = true,
        LimitToServiceRequests = false,
    });
    

    【讨论】:

    • 正是我想要的。
    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多