如何在servicestack中记录调试请求和响应

时间:2012-07-23 02:59:58

标签: logging servicestack

我想记录整个请求& servicestack webservice的响应对。 我查看了响应文件管理器,但是公开的流是只读的。

2 个答案:

答案 0 :(得分:12)

您是否看过ServiceStack的内置Request Logger插件? 它是一个可配置的内存中请求记录器,用于维护最近请求的日志/(错误响应)。

如果您想要一个不同的行为,您可以实现并注册自己的IRequestLogger,每次请求都会调用它。使用以下参数为每个请求调用log方法。

void Log(IRequestContext requestContext, object requestDto, 
         object response, TimeSpan elapsed);

您还可以从请求上下文中检索IHttpRequest / IHttpRespnse对:

var httpReq = requestContext.Get<IHttpRequest>();
var httpRes = requestContext.Get<IHttpResponse>();

从这里,您可以使用

获取原始的ASP.NET / HttpListener请求/响应类型
var originalReq = httpReq.OriginalRequest;
var originalRes = httpReq.OriginalResponse;

过滤回复

否则,内省反应的方法是

答案 1 :(得分:1)

此 RequestFilter 允许您打印原始请求内容。如果需要,您可以修改它以获取更多信息,如标题和 cookie。正如@mythz 在评论中指出的那样,这不如 Request Logger 插件详细。但是,如果您只想为单个请求添加日志记录,则可能更可取。 免责声明:此代码可能不是生产就绪的,我不会将其用于生产。

public class RequestDataSpyAttribute : RequestFilterAttribute
{
    // gets injected by ServiceStack
    public ILog Log { get; set; }

    private readonly string _logMessage;

    public RequestDataSpyAttribute(string logMessage)
    {
        _logMessage = logMessage;
    }

    public override void Execute(IRequest req, IResponse res, object requestDto)
    {
        System.Web.HttpRequestWrapper original = req.OriginalRequest as System.Web.HttpRequestWrapper;
        if (original == null)
            return;

        Log.Debug($"{_logMessage} Request: {original.InputStream.ReadToEnd()}");
    }
}