2009-12-29 21 views
26

¿Puedo agregar un encabezado SOAP personalizado en los mensajes entrantes/salientes de WCF en basicHttpBinding, como que podemos agregar un encabezado de autenticación personalizado en los servicios web ASMX? El encabezado SOAP personalizado debe ser accesible usando clientes de servicio web .net 2.0/1.1 (accesible mediante la herramienta WSDL.EXE).Cómo agregar encabezados de soap personalizados en wcf?

+0

actualizó mi respuesta con información sobre los inspectores de mensajes –

+0

actualicé mi respuesta nuevamente con información sobre la interoperabilidad de ASMX/WCF con respecto al header SOAP –

+0

gracias marc_s, esto se ve bien, lo intentaré. – nRk

Respuesta

26

Eche un vistazo al WCF Extras en Codeplex - es una biblioteca de extensión fácil para WCF que ofrece, entre otras cosas, encabezados SOAP personalizados.

Otra opción es usar WCF message contracts en su servicio WCF, esto también le permite definir y establecer fácilmente encabezados SOF WCF.

[MessageContract] 
public class BankingTransaction 
{ 
    [MessageHeader] 
    public Operation operation; 
    [MessageHeader] 
    public DateTime transactionDate; 

    [MessageBodyMember] 
    private Account sourceAccount; 
    [MessageBodyMember] 
    private Account targetAccount; 
    [MessageBodyMember] 
    public int amount; 
} 

Aquí, la "operación" y la "fecha de transacción" se definen como encabezados SOAP.

Si ninguno de esos métodos ayuda, entonces debería verificar el concepto de inspectores de mensajes WCF que puede escribir como extensiones. Le permiten, por ejemplo, Inyectar ciertos encabezados en el mensaje en cada llamada saliente en el cliente y recuperarlos del mensaje en el servidor para su uso.

Vea esta publicación de blog Handling custom SOAP headers via WCF Behaviors para obtener un punto de partida sobre cómo escribir un inspector de mensajes y cómo incluirlo en la configuración de su proyecto.

el lado del cliente IClientMessageInspector define dos métodos BeforeSendRequest y AfterReceiveReply mientras que el lado del servidor IDispatchMessageInspector tiene los métodos opuestos, es decir AfterReceiveRequest y BeforeSendReply.

Con esto, podría agregar encabezados a cada mensaje que pasa por el cable (o selectivamente solo a unos pocos).

He aquí un fragmento de un implementador IClientMessageInspector que utilizamos para transmitir automagicamente la información local (idioma y la información de la cultura) frente a los clientes al servidor - que debe dar una idea de cómo empezar:

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; 
} 

En el lado del servidor, entonces verificaría la presencia de esos encabezados, y si están presentes, extráigalos del sobre SOAP y úselos.

ACTUALIZACIÓN: bien, estás clientes están en .NET 2.0 y no utilizando WCF - buena noticia es que esto todavía debería funcionar bien - ver esta entrada del blog Custom SOAP Headers: WCF and ASMX para más detalles. Todavía puede usar el inspector de mensajes del lado del servidor para olfatear y extraer los encabezados personalizados que envían sus clientes .NET 2.0.

+0

Gracias marc_s, traté de usar WCF Extras, agregué el atributo "XmlSerializerFormat" al Service Contract WCF Extras arrojó un error al acceder a los Servicios. ¿Hay alguna otra solución disponible como WCF Extras? ¿Puedo agregar MessageContract como atributo a todos los métodos cuando agregué SoapHeader en servicios ASMX? Mi requisito es que debo enviar algunos datos (el mismo nombre de usuario y contraseña) para cada llamada al servicio WCF. ¿Hay alguna forma de implementar esto? – nRk

+0

yah marc_s, se ve genial. pero en el artículo mencionado el cliente debería estar en .NET 3.0 o superior ... pero en mi caso, los clientes están en .net 2.0 y 1.1. ¿Todavía es posible implementar este? – nRk

Cuestiones relacionadas