Фон:
Я пытаюсь устранить проблему, когда сообщения, отправленные WCF поверх транзакционного MSMQ (с netMsmqBinding), как будто исчезают. Код, который использует WCF, находится в сторонней сборке, которую я не могу изменить. У меня мало подсказок, в чем проблема, но планируем включить различные возможности трассировки, чтобы точно определить, где эта проблема.
Контекст:
-
Я включил MSMQ Концевая трассировка. Он регистрирует два события для каждого отправленного сообщения.
- Одно событие, когда сообщение отправляется в исходящую очередь. Это сообщение содержит идентификатор сообщения MSMQ (который состоит из guid и целого числа, то есть 7B476ADF-DEFD-49F2-AF5A-0CF27C5152C0\6481271).
- Другое событие, когда это сообщение отправляется по сети.
-
Я включил подробный трафик WCF.
-
У меня также есть регистрация уровня приложения, которая регистрирует идентификаторы сообщений, определенные кодом приложения (позвольте мне назвать это "идентификатор сообщения приложения" ).
-
Я включил положительное и отрицательное журналирование источника сообщений MSMQ, которые отправляются.
-
Я включил ведение журнала в очереди приема.
Проблема:
Когда сообщения пропадают, я знаю недостающий идентификатор приложения сообщения (он регистрируется отправляющей стороной). Теперь я хотел бы посмотреть трассировку End-to-End, чтобы увидеть было ли сообщение записано в исходящую очередь или нет.
Как я могу сопоставить события в трассе End-to-End с журналами уровня приложений и трассировками WCF?
Идеи:
-
При отправке сообщения MSMQ с использованием управляемого MSMQ API в System.Messaging сообщение MSMQ сообщения доступно после отправки сообщения. Однако я не нашел способ зарегистрировать это, когда WCF выполняет операцию отправки. Трасса WCF регистрирует MSMQMessageId guid, но это значение, на удивление, не является фактическим идентификатором MSMQ, как я предполагал. Возможно ли получить доступ к фактическому идентификатору сообщения MSMQ и зарегистрировать его?
-
Запишите идентификатор собственного потока в журнале приложений вместе с идентификатором уровня приложения и отметкой времени. Идентификатор собственного потока регистрируется в концевой трассировке MSMQ, поэтому на самом деле этого может быть достаточно для корреляции. Это план Б для меня, если я не найду более элегантное решение.