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