2009-12-29 4 views
26

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

+0

обновил мой ответ с информацией о контролерах сообщений –

+0

обновил мой ответ снова с информацией об совместимости ASMX/WCF в отношении SOAP headesr –

+0

спасибо marc_s, это выглядит хорошо, я попробую. – nRk

ответ

26

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

Другой вариант - использовать WCF message contracts в вашей службе 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; 
} 

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

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

Посмотрите на это сообщение в блоге Handling custom SOAP headers via WCF Behaviors, чтобы узнать, как написать инспектор сообщений и как его включить в настройку вашего проекта.

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

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

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

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 and ASMX для деталей. Вы все равно можете использовать инспектор сообщений на стороне сервера, чтобы обнюхать и извлечь пользовательские заголовки, отправляемые вашими клиентами .NET 2.0.

+0

Спасибо marc_s, я пытался использовать WCF Extras, я добавил атрибут «XmlSerializerFormat» в Service Contract WCF Extras выдает ошибку при доступе к службам. Есть ли другое решение, например, WCF Extras? Могу ли я добавить атрибут MessageContract как атрибут для всех методов, поскольку я добавил SoapHeader в службы ASMX? Мое требование состоит в том, что мне нужно отправить данные (то же самое имя пользователя и пароль) для каждого вызова службы WCF. Есть ли способ реализовать этот? – nRk

+0

yah marc_s, это выглядит великолепно. но в упомянутой статье клиент должен находиться в .net 3.0 или выше .. но в моем случае клиенты находятся в .net 2.0 и 1.1. Можно ли это реализовать? – nRk

Смежные вопросы