我想记录整个请求& servicestack webservice的响应对。 我查看了响应文件管理器,但是公开的流是只读的。
答案 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()}");
}
}