передать токен корреляции службе WCF? - PullRequest
4 голосов
/ 26 сентября 2011

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

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

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

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

1 Ответ

3 голосов
/ 26 сентября 2011

Так вам нужна только информация о запросе и его ответе? Если вы используете версию сообщения с 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-Addressing, вы должны использовать службу SOAP с WsHttpBinding или CustomBinding, используя правильный MessageVersion в TextMessageEncodingBindingElement.

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

...