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