ServiceStack RequestLogger 只记录一次服务调用

ServiceStack RequestLogger only logs one service call

假设我有一个服务通过 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 标志,这会阻止记录其他网关调用。

让 Service Stack 真正记录所有这些调用的首选解决方案是什么?

我临时在 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);
            }
}

但是,这感觉有点老套...例如为什么这面旗帜一开始就在那里?

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

请求记录器的标志正是这样它只记录实际的 HTTP 服务请求,而不是 "in process" 请求,即它可以防止你想要的行为,因为它会重复原始请求的 HTTP headers 不是没有任何网关请求的。

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

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