如何确保 OnEndRequest 筛选器在 ValidationFeature 的全局筛选器失败后在 ServiceStack 中运行?



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

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

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

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

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

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

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

如果出现异常,ServiceRunner将调用您可能已在AppHost注册的任何全局异常处理程序。

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

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

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

最新更新