gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:42:01 25 4
gpt4 key购买 nike

我有一个 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无论状态如何,全局响应过滤器都应该触发。但对我来说,他们不是。我应该从哪里开始寻找?

最佳答案

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

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

在异常情况下,ServiceRunner将调用任何全局 exception handler您可能已经注册 AppHost .

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

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

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

关于servicestack - ValidationFeature 的全局过滤器请求失败后,如何确保 OnEndRequest 过滤器在 ServiceStack 中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18744076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com