Cómo agregar encabezados de soap personalizados en wcf?

¿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).

Consulte los extras de WCF 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 contratos de mensajes WCF en su servicio WCF; esto también le permite definir y establecer fácilmente encabezados SOAP 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 el “día 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 de WCF que puede escribir como extensiones. 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.

Consulte esta publicación en el blog Manejo de encabezados SOAP personalizados a través de Behaviors de WCF 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 cruce el cable (o selectivamente solo a unos pocos).

Aquí hay un fragmento de un implementador de IClientMessageInspector que utilizamos para transmitir automágicamente la información de la configuración regional (idioma e información cultural) desde los clientes al servidor: esto debería darle una idea de cómo comenzar:

 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: de acuerdo, sus clientes están en .NET 2.0 y no usan WCF. Las buenas noticias son que esto debería funcionar bien. Consulte esta publicación de blog Encabezados personalizados de SOAP: WCF y ASMX para obtener más información. 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.