передача токена корреляции в службу WCF?

Имея много похожих вызовов, возможно, параллельно, к некоторым веб-сервисам, мне интересно, как лучше всего реализовать механизм токена корреляции.

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

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

PS: в своем решении я контролирую как клиентскую, так и серверную часть. Я могу изменить все, что нужно. МОИ службы работают с .Net V4, и я использую log4net для создания журналов. Я завернул в log4net некоторые служебные методы, которые я могу изменить при необходимости.


person Steve B    schedule 26.09.2011    source источник


Ответы (1)


Итак, вам нужна только информация о запросе и его ответе? Если вы используете версию сообщения с WS-Addressing, она должна быть у вас автоматически, потому что каждое сообщение будет содержать свой автоматически сгенерированный идентификатор (guid), и каждый ответ также будет содержать идентификатор запроса. Вы можете получить доступ к этим заголовкам через OperationContext:

Сторона сервера:

UniqueId id = OperationContext.Current.IncomingMessageHeaders.MessageId;

Сторона клиента:

using (var scope = new OperationContextScope())
{
    // Do call to server and after that access headers

    OperationContext context = OperationContext.Current;
    UniqueId responseId = context.IncomingMessageHeaders.MessageId;
    UniqueId requestId = context.IncomingMessageHeaders.RelatesTo;
}

Чтобы использовать WS-адресацию, вы должны использовать службу SOAP с WsHttpBinding или CustomBinding, используя правильные MessageVersion в TextMessageEncodingBindingElement.

Если вы хотите иметь корреляцию для всех запросов от одного и того же клиента, вам нужен сеанс WCF и используйте идентификатор сеанса (OperationContext.Current.SessionId).

person Ladislav Mrnka    schedule 26.09.2011
comment
спасибо :) это именно то, что я хочу сделать. Немного инкапсуляции, и мой лог будет подаваться с этим ID. - person Steve B; 26.09.2011