Как передать информацию, извлеченную из заголовка сообщения в 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);