我想记录 servicestack webservice 的整个请求和响应对。我查看了响应文件管理器,但是暴露的流是只读的。
问问题
4978 次
2 回答
12
你见过 ServiceStack 内置的Request Logger Plugin 吗?它是一个可配置的内存、CSV 或 Redis 请求记录器,用于维护最近请求的日志 /(错误响应)。
如果您想要不同的行为,您可以实现并注册自己的IRequestLogger,它会为每个请求调用。使用以下参数为每个请求调用它的 log 方法。
Log(IRequest httpReq, object requestDto, object response, TimeSpan duration);
从IRequest
你可以得到原始的 .NET Core/ASP.NET/HttpListener Request / Response 类型
var originalReq = httpReq.OriginalRequest;
var originalRes = httpReq.OriginalResponse;
过滤响应
否则,内省响应的方法是
- 响应过滤器或响应过滤器属性;或者
- 在继承自 Rest/ServiceBase 的您自己的基类上覆盖OnAfterExecute()
于 2012-07-23T04:31:53.367 回答
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()}");
}
}
于 2021-03-09T19:50:54.433 回答