ServiceStack - 为IRequestLogger模拟更强大的范围

时间:2014-02-19 14:06:12

标签: servicestack

这不是关于RequestLogsService或RequestLogFeature的问题。它是关于ServiceRunner对IRequestLogger的调用(如果在应用程序容器中注册了它)。

我的应用程序已定期登录,我转储应用程序的流程以记录文件。

我现在正在实现一个受RequestLogsService启发的数据库日志。此日志将包含每个请求一行,包含所有请求和响应数据。

然而,我的终点产生了4个不同级别的输出:

  • 自定义身份验证过滤器
  • 验证
  • 服务
  • AppHostExceptionHandler

从那些4中,只有服务输出被IRequestLogger覆盖,因为它的ServiceRunner相关。有什么方法可以透明地覆盖我的4个场景吗?我想尽量减少管道中引入的复杂性。

由于

1 个答案:

答案 0 :(得分:2)

我最近遇到了类似的问题并按如下方式解决了这个问题:

自定义身份验证过滤器

根据您希望的日志记录类型,这有两种可能性。如果您在这里抛出异常,可以通过在AppHost中设置ServiceExceptionHandler来捕获它:

this.ServiceExceptionHandler = (httpRequest, request, exception) =>
{
    LogData(httpRequest, exception);
    return DtoUtils.HandleException(this, request, exception);
};

如果该方法对您不起作用或者您在auth期间不抛出异常,则必须在运行auth过滤器之前或之后创建日志记录过滤器。这可以使用PreRequestFilterRequestFilter在几个不同的位置完成,具体取决于您何时需要它运行(请参阅ServiceStack的Order of Operations)。

<强>验证

我假设您正在使用ServiceStack内置的FluentValidation来执行验证。在这种情况下,您可以像这样挂钩插件的ErrorResponseFilter。请注意,如果您在此方法中需要IHttpRequest和IHTTPresponse对象,则可能必须执行hack-y解决方法并将它们存储在某处,因为它们未提供。:

Plugins.Add(new ValidationFeature { ErrorResponseFilter = ValidationErrorResponseFilter});
...
private object ValidationError(ValidationResult validationResult, object o)
{
    var httpError = o as HttpError;
    LogData(httpError);
}

<强> AppHostExceptionHandler

如果在AppHost的设置中发生异常,您可能必须使用简单的try / catch结算。但是,如果在请求处理期间AppHost中发生异常,您可以使用与ExceptionHandler类似的ServiceExceptionHandler

this.ExceptionHandler = (httpReq, httpRes, operationName, ex) =>
{
    LogData(httpReq, httpRes);
}

总之,如果所有这些都无效或太多地方的代码太多,您可以采用覆盖ServiceRunner中的一个或多个方法来获取内容你需要。在我的情况下,我重写OnAfterExecute以记录每个发送给服务处理程序的请求,然后只需要将异常处理程序添加到FluentValidation,如上所述。