C # HttpRequestMessage.GetCorrelationId метод возвращает дубликаты - PullRequest
0 голосов
/ 12 февраля 2019

Моя команда и я работаем над этой проблемой в течение нескольких дней, и мы не можем определить основную причину, почему GetCorrelationId () иногда возвращает GUID дубликатов.

В приложении, с которым я работаюпрямо сейчас мы используем идентификатор корреляции, чтобы связать путь запроса.

Например, пользовательский интерфейс отправляет запрос на сохранение в API в .NET.Когда API вызывает метод save из службы запросов из контроллера, он передает результат Request.GetCorrelationId() в вызов метода.

Метод save в службе запросов использует этот параметр для вставки новой строки.в таблице aud_logs с информацией о запросе.

Затем метод save вызывает другие методы сохранения для вложенных объектов, принадлежащих основному объекту, передавая значение correlation_id, сгенерированное в контроллере.

Примерно так

[ Controller ]
var correlation_id = HttpRequestMessage.GetCorrelationId();
{
  ParentObject.save(correlation_id) -> {
    ChildObject1.save(correlation_id),
    ChildObject2.save(correlation_id),
  }
}

У меня вопрос такой.Является ли это проблемой того, как GetCorrelationId создает объект GUID, или что-то не так с конфигурацией инфраструктуры?

Структура - .NET Framework 4.6.1. Мы видим эту проблему в IIS Express и сервере IIS

Я не могу поделиться кодом, но я сделаю все возможное, чтобы поделиться как можно большей информацией, необходимой для устранения этой проблемы.

Это несколько примеров дубликатов GUID

enter image description here

Спасибо

1 Ответ

0 голосов
/ 13 февраля 2019

ОК, я нашел решение.Я публикую его, так что, если у кого-то еще есть такая же проблема, можно получить этот пример.

После еще нескольких поисков в Google я нашел это сообщение https://www.codeproject.com/Articles/392926/Grouping-application-traces-using-ActivityId

Себастьян использует ActivityId, сгенерированныйIIS, чтобы связать воедино различные команды, выполняемые во время его процесса.

Затем я нашел исходный код HttpRequestMessageExtensions https://github.com/aspnet/AspNetWebStack/blob/master/src/System.Web.Http/HttpRequestMessageExtensions.cs

Там вы можете видеть, что метод GetCorrelationId () использует ActivityId дляприсвойте запросу идентификатор корреляции.

ActivityId не является полностью случайным.Это связано с темой, запущенной IIS.Я заметил, что все наши запросы от localhost: port имеют одинаковую строку в конце b63f-84710c7967bb.

Мы хотели связать все выполненные команды, чтобы сохранить объект или получить его.Таким образом, все, что нам было нужно - это случайный Guid, сгенерированный для каждого запроса.Следуя примеру, опубликованному Себастьяном, я сохранил текущий ActivityId в переменной aux, затем присвоил ему новый GUID, выполнил Request.GetCorrelationId () и, наконец, присвоил обратно идентификатор, сохраненный в переменной aux, в ActivityId.

В псевдокоде =>

Guid prevActivityId = Trace.CorrelationManager.ActivityId
Trace.CorrelationManager.ActivityId = Guid.NewGuid()
...

guid correlation_id = Request.GetCorrelationId()

...
Trace.CorrelationManager.ActivityId = prevActivityId

Надеюсь, это поможет кому-то еще.

...