Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

[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 Message Inspectors, которую вы можете написать как расширения. Они позволяют вам, например, вставлять определенные заголовки в сообщение при каждом исходящем вызове на клиенте и извлекать их из сообщения на сервере для вашего использования.

См. это сообщение в блоге Обработка пользовательских заголовков 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 и используйте их.

ОБНОВЛЕНИЕ: хорошо, вы находитесь на .NET 2.0 и не, используя WCF - хорошая новость заключается в том, что это все равно будет работать нормально - см. этот пост в блоге Пользовательские заголовки SOAP: WCF и ASMX. Вы все равно можете использовать инспектор сообщений на стороне сервера, чтобы обнюхать и извлечь пользовательские заголовки, отправляемые клиентами .NET 2.0.