ServiceStack RequestLogger 仅记录一次服务调用

标签 servicestack

假设我有一个服务通过 Gateway.Send 调用许多其他服务:

public class SomeService : Service {  

       public SomeServiceResponse Any (SomeServiceRequest request) {

           var response1 = Gateway.Send<AnotherServiceResponse> (new AnotherServiceRequest());

           var response2 = Gateway.Send<YetAnotherServiceResponse> (new YetAnotherServiceRequest());

           var response3 = Gateway.Send<LastServiceResponse> (new LastServiceResponse());

       }
}

在这种情况下,我在启动时注册的自定义 IRequestLogger 将仅在调用第一个 Gateway.Send() 时调用一次其 Log() 方法。

查看服务堆栈的代码并检查请求(ASP.NET 请求)对象后 - 似乎在第一个日志之后,添加了一个 _logged 标志,这会阻止记录其他网关调用。

让服务堆栈真正记录所有这些调用的首选解决方案是什么?

我暂时将其添加到我的 RequestLogger 的 Log 方法中:

public void Log(IRequest request, object requestDto, object response, TimeSpan elapsed)
{ 
(...)

// service stack sets a flag on parent request that logged once.. clear it to support multiple service calls
            if (request.Items.ContainsKey(Keywords.HasLogged)){
                request.Items.Remove(Keywords.HasLogged);
            }
}

但是,这感觉有点hacky...例如为什么这个标志一开始就在那里?

(我使用的是旧版本的 SS (5.0.2),但我注意到设置标志的 ServiceRunner 代码也在最新版本中)

最佳答案

请求记录器的标志是精确的,因此它只记录实际的 HTTP 服务请求,而不是“处理中”请求,即它可以防止您想要的导致困惑和错误报告的行为,因为它会重复以下 HTTP header 原始请求不是网关请求,网关请求没有任何请求。

您可以在 IAppHost.GatewayResponseFilters 自定义 Hook 中添加网关请求的任何自定义逻辑,该 Hook 仅针对服务网关请求触发,例如:

GatewayResponseFilters.Add((req,response) => {
    req.TryResolve<IRequestLogger>.Log(req, req.Dto, response, TimeSpan.Zero);
});

关于ServiceStack RequestLogger 仅记录一次服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56570960/

相关文章:

Bloomberg OpenFIGI 的 ServiceStack 包装器

json - ServiceStack ORMLite 未反序列化存储在数据库文本字段中的 JSON

https - ServiceStack JsonServiceClient 可以向带有自签名证书的 https 发送获取请求吗?

c# - 如何从强命名主机使用 ServiceStack?

android - 在 Android 的 JsonServiceClient 中发送自定义 header ?

servicestack - 为什么 ServiceStack 将伪造的 ss-id cookie 值反射回客户端?

postgresql - 如何将 servicestack 创建的默认 Postgres 列数字更改为数字 (38,20)

c# - IE 将 url 视为下载而不是 HTML 页面

authentication - 从 ServiceStack 利用表单例份验证的最简洁方法是什么?

ServiceStack:为什么我的调用没有解析为正确的路由?