2011-03-08 6 views
5

añado un encabezado personalizado de WCF con el siguiente códigoCómo agregar un atributo al encabezado del mensaje WCF con el método MessageHeader.CreateHeader()?

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

Con esto también quiero añadir

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

como un atributo de esta cabecera del mensaje.

¿Hay alguna forma de agregar el espacio de nombres y el atributo anteriores al encabezado del mensaje?

Respuesta

7

Encontré la solución. Tenemos que implementar el encabezado custome, que está inhertied de la clase MessageHeader.

La clase MessageHeader tiene el método OnWriteStartHeader(). Podemos agregar espacios de nombres xml en este método.

También tenemos que anular el método OnWriteHeaderContents() y escribir xml o el valor que queremos como MessageHeader.

Una vez que esté listo, agregue el encabezado del mensaje en request.Header.Add() pase el objeto de nuestra clase de encabezado personalizado.

Consulte los enlaces siguientes más detalles.

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

0

Define una clase XmlSerializable que se serializa al formato de elemento XML que deseas para tu encabezado. A continuación, pase una instancia de esta clase como el parámetro value de MessageHeader.CreateHeader.

0

Si se utiliza la clase AddressHeader se añade automáticamente el atributo IsReferenceParameter. El siguiente método de extensión para ChannelFactory haría lo que usted quisiera.

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(); 
} 
Cuestiones relacionadas