Как передать информацию, извлеченную из заголовка сообщения в DispatchMessageInspector, в ServiceContract?

Я пытаюсь передать пользовательскую информацию от контроллера на сервисный уровень.

IClientMessageInspectors а также IDispatchMessageInspectors кажется наиболее вероятным решением.

Пройдя через Построение инспектора сообщений агента пользователя HTTP и написание инспектора сообщений WCF, я понял, как добавить информацию в заголовок сообщения и как его прочитать.

Что я не могу понять, это:

Как получить информацию о пользователе в IClientMessageInspector ?

Внутри контроллера я раньше судился User.Identity.Name, Но объект User недоступен в инспекторе сообщений. Один из способов получить эту информацию в инспекторе сообщений - передать ее в конструкторе, но я никогда не создаю явно объект MessageInspector, так как я могу передать информацию о пользователе в его конструкторе.

Изменить: я нашел ответ на свой первый вопрос. Информация о пользователе может быть получена с помощью System.Threading.Thread.CurrentPrincipal.Identity.Name. Все еще застрял со второй частью.

Как сделать информацию о пользователе доступной внутри метода обслуживания?

Я могу просмотреть заголовки и получить информацию о пользователе из заголовка сообщения в DispatchMessageInspector, но как мне получить эту информацию в одном из моих контрактов на операции?

1 ответ

Создать класс со свойствами, связанными с информацией о пользователе. Объект Overide BeforeSendRequest(ref Message request, IClientChannel channel); метод устанавливает значение в заголовке, используя этот метод -MessageHeader _messageHeader = MessageHeader.CreateHeader(); и поставить объект использования информации класса.

// Summary:
//     Creates a new message header with the specified data.
//
// Parameters:
//   name:
//     The local name of the header XML element.
//
//   ns:
//     The namespace URI of the header XML element.
//
//   value:
//     The content of the header to be created.
//
// Returns:
//     A System.ServiceModel.Channels.MessageHeader.
public static MessageHeader CreateHeader(string name, string ns, object value); 

На стороне службы получить его из - метода класса MessageHeaders--

// Summary:
//     Finds a message header in this collection by the specified LocalName and
//     namespace URI of the header element.
//
// Parameters:
//   name:
//     The LocalName of the header XML element.
//
//   ns:
//     The namespace URI of the header XML element.
//
// Type parameters:
//   T:
//     The message header.
//
// Returns:
//     A message header.
public T GetHeader<T>(string name, string ns);
Другие вопросы по тегам