在ValidationFeature的全局过滤器请求失败后,如何确保OnStndRequest过滤器在ServiceStack中运行?

时间:2013-09-11 14:33:35

标签: servicestack response

我有一个ServiceStack API(3.9.58)。我正在使用statsd为请求执行提供时间,通过实现注册全局请求过滤器和全局响应过滤器的IPlugin(我知道RequestLogFeature;这不是唯一的事情)。它会在请求开始时在项目集合中粘贴已启动的Stopwatch,并在请求完成后再将其拉出。

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

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

但是,当我使用开箱即用的ValidationFeature添加验证时,由于请求不满足我的验证规则,我停止获取转储4xx的请求的计时信息。

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

1 个答案:

答案 0 :(得分:3)

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

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

如果是例外,ServiceRunner会调用您在AppHost注册的全局exception handler

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

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

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