Как добавить атрибут в заголовок сообщения WCF с помощью метода MessageHeader.CreateHeader()?

Я добавляю пользовательский заголовок WCF со следующим кодом

 MessageHeader header = MessageHeader.CreateHeader("Key", "ns", "Value");
 OperationContext.Current.OutgoingMessageHeaders.Add(header);

К этому я также хочу добавить

    xmlns:wsa="http://www.w3.org/2005/08/addressing"
   wsa:IsReferenceParameter="1"

в качестве атрибута этого заголовка сообщения.

Есть ли способ добавить вышеуказанное пространство имен и атрибут в заголовок сообщения?


person Tanaji Kamble    schedule 08.03.2011    source источник


Ответы (3)


Я нашел решение. Мы должны реализовать собственный заголовок, который унаследован от класса MessageHeader.

Класс MessageHeader имеет метод OnWriteStartHeader(). Мы можем добавить пространства имен xml в этот метод.

Также мы должны переопределить метод OnWriteHeaderContents() и записать xml или значение, которое мы хотим, в качестве MessageHeader.

Как только это будет готово, при добавлении заголовка сообщения в request.Header.Add() передайте объект нашего пользовательского класса заголовка.

Более подробную информацию см. по следующим ссылкам.

http://www.netframeworkdev.com/windows-communication-foundation/messageheader-serializer-how-to-use-attributes-52827.shtml

http://social.msdn.microsoft.com/forums/en-US/wcf/thread/c2a39df8-3943-4c41-acca-6da8e96f0dff

person Tanaji Kamble    schedule 17.03.2011

Определите класс XmlSerializable, который сериализуется в формат XML-элемента, который вы хотите использовать для своего заголовка. Затем передайте экземпляр этого класса в качестве параметра value для MessageHeader.CreateHeader.

person Chris Dickson    schedule 08.03.2011

Если вы используете класс AddressHeader, он автоматически добавляет атрибут isReferenceParameter. Следующий метод расширения ChannelFactory будет делать то, что вы хотите.

public static void AddHeader<T>(this ChannelFactory<T> factory, string headerName, string value, string nameSpace)
{
    var endpointAddressBuilder = new EndpointAddressBuilder(factory.Endpoint.Address);
    endpointAddressBuilder.Headers.Add(AddressHeader.CreateAddressHeader(headerName, nameSpace, value));

    factory.Endpoint.Address = endpointAddressBuilder.ToEndpointAddress();
}
person Graham    schedule 12.02.2015