ServiceStack RequestLogger регистрирует только один вызов службы - PullRequest
2 голосов
/ 13 июня 2019

Допустим, у меня есть служба, которая вызывает множество других служб через шлюз. Отправка:

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, который я зарегистрировал при запуске, будет вызывать свой метод Log () только один раз при вызове первого Gateway.Send ().

После просмотра кода стека службы и проверки объекта Request (запрос ASP.NET) - кажется, что после первого журнала добавляется флаг _logged, что предотвращает вход в систему других вызовов шлюза.

Какое решение было бы предпочтительным, чтобы Service Stack действительно регистрировал все эти вызовы?

Я временно добавил это в метод лога RequestLogger:

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, который устанавливает флаг, также присутствует в последней версии)

1 Ответ

3 голосов
/ 13 июня 2019

Флаг для Регистратора запросов точно такой, что он регистрирует только фактические запросы службы HTTP, а не запросы «в процессе», т. Е. Предотвращает поведение, которое вам нужно, что может привести к сбивающим с толку и ложным отчетам, поскольку он будет повторять заголовки HTTPисходный запрос, а не запрос шлюза, который не имеет.

Вы можете добавить любую настраиваемую логику для запросов шлюза в настраиваемую ловушку IAppHost.GatewayResponseFilters, которая запускается только для запросов шлюза службы, например:

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