假设我有一个服务通过 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/