2

我有一个 ServiceStack API (3.9.58)。我正在使用 statsd 来计时请求执行,方法是实现一个注册全局请求过滤器和全局响应过滤器的 IPlugin(我知道 RequestLogFeature;这不是唯一的事情)。当请求开始时,它会在 items 集合中粘贴一个Stopwatchstart,并在请求完成后再次将其拉出。

    .....
    public void Register(IAppHost appHost)
    {
        appHost.RequestFilters.Add(OnBeginRequest);
        appHost.ResponseFilters.Add(OnEndRequest);
    }
    .....

这是一种享受(就像它在 中一样ServiceRunner,在哪里IRequestLogger做同样的事情)。

但是,当我使用 out-of-the-box 添加验证时ValidationFeature,由于请求不满足我的验证规则,我停止获取转储 4xx 的请求的时间信息。

我从这个 SO question中看到,无论状态如何,全局响应过滤器都应该触发。但对我来说,他们不是。我应该从哪里开始寻找?

4

1 回答 1

3

简短的回答是全局响应过滤器并不总是执行,您需要注册一些额外类型的回调来处理某些情况,或者采取诸如子类化类的方法ServiceRunner

您链接的 SO 问题指出“无论服务返回什么状态代码,都会执行全局响应过滤器”。这就是说,当服务成功返回响应对象时,应该始终执行全局响应过滤器。但是,服务或插件可能会引发异常或调用EndServiceStackRequest,在这种情况下,该断言不适用。

在发生异常的情况下,ServiceRunner调用您可能已向.AppHost

为了处理验证失败的情况,您可以为您在 AppHost 中注册为插件ErrorResponseFilter的对象的属性设置回调函数。ValidationFetaure

另一种方法是子类ServiceRunner化并覆盖该Execute方法(并实现CreateServiceRunner),或者注册一个 HTTP 模块,以便拥有一组始终在请求结束时执行的代码。

有关验证失败时发生的情况的更多详细信息: ValidationFeature 设置的过滤器WriteToResponse在验证失败的情况下调用带有错误信息的扩展方法,最终调用EndServiceStackRequest. 在这种情况下,ServiceRunner 将简单地从Execute方法中提前返回。ServiceRunner 不会调用服务操作、运行响应过滤器或调用OnAfterExecute方法。

于 2013-09-11T15:49:03.967 回答