Как добавить пользовательские заголовки мыла в wcf?

Я могу добавить Пользовательский заголовок SOAP в поступлении/исходящих сообщениях WCF в basicHttpBinding, как мы можем добавить пользовательский заголовок аутентификации в веб-сервисах ASMX? Те пользовательский заголовок SOAP должен быть доступным использованием клиенты веб-сервиса .net 2.0/1.1 (доступный инструментом WSDL.EXE).

26
задан John Saunders 11 February 2014 в 21:06
поделиться

1 ответ

Посмотрите WCF Extras на Codeplex - это простая библиотека расширений для WCF, которая предлагает - среди прочего - пользовательские SOAP-заголовки.

Другой вариант - использование контрактов сообщений WCF в службе WCF - это также легко позволяет определить и установить заголовки SOAP WCF.

[MessageContract]
public class BankingTransaction
{
  [MessageHeader]
  public Operation operation;
  [MessageHeader] 
  public DateTime transactionDate;

  [MessageBodyMember] 
  private Account sourceAccount;
  [MessageBodyMember] 
  private Account targetAccount;
  [MessageBodyMember] 
  public int amount;
}

Здесь "операция" и "transactionDate" определяются как заголовки SOAP.

Если ни один из этих методов не помогает, то Вам следует ознакомиться с концепцией Инспекторов сообщений WCF, которую Вы можете написать как расширение. Они позволяют, например, вставлять определенные заголовки в сообщение при каждом исходящем вызове клиента и извлекать их из сообщения на сервере для использования.

Смотрите это сообщение в блоге Обработка пользовательских заголовков SOAP через WCF Behaviors, чтобы узнать, как написать инспектор сообщений, и как включить его в настройку вашего проекта.

На стороне клиента IClientMessageInspector определяет два метода BeforeSendRequest и AfterReceiveReply, в то время как на стороне сервера IDispatchMessageInspector используются противоположные методы, т.е. AfterReceiveRequest и BeforeSendReply.

С помощью этого метода можно добавлять заголовки к каждому сообщению, проходящему через провод (или выборочно только к нескольким).

Вот фрагмент от реализации IClientMessageInspector, который мы используем для автоматической передачи информации о локали (языковой и культурной информации) от клиентов к серверу - это должно дать вам представление о том, как начать:

public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
    International intlHeader = new International();
    intlHeader.Locale = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;

    MessageHeader header = MessageHeader.CreateHeader(WSI18N.ElementNames.International, WSI18N.NamespaceURI, intlHeader);
    request.Headers.Add(header);

    return null;
}

На стороне сервера вы проверяете наличие этих заголовков, и если они присутствуют, извлекаете их из SOAP-конверта и используете их.

UPDATE: хорошо, вы клиенты на .NET 2.0 и не с использованием WCF - хорошая новость в том, что это все равно должно работать просто отлично - смотрите этот пост в блоге Custom SOAP Headers: WCF и ASMX для подробностей. Вы все еще можете использовать инспектор сообщений на стороне сервера для прослушивания и извлечения пользовательских заголовков, отправляемых вашими клиентами .NET 2.0.

.
26
ответ дан 28 November 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: