Migración de los servicios web WSE 3.0 a WCF

Entre las ventajas de migrar los servicios web WSE 3.0 a Windows Communication Foundation (WCF) se incluyen una mejora del rendimiento y la compatibilidad con transportes adicionales, escenarios de seguridad adicionales y especificaciones WS - *. Un servicio web que se migra de WSE 3.0 a WCF puede experimentar una mejora del rendimiento de un 200 % a un 400 %. Para obtener más información sobre los transportes que admite WCF, consulte Elección de un transporte. Para obtener una lista de los escenarios que admite WCF, consulte Escenarios comunes de seguridad. Para obtener una lista de las especificaciones que admite WCF, consulte Guía de interoperabilidad de protocolos de servicios web.

Las siguientes secciones proporcionan una guía sobre cómo migrar una característica específica de un servicio web WSE 3.0 a WCF.

General

WSE 3.0 y las aplicaciones WCF incluyen interoperabilidad a nivel de conexión y un conjunto común de terminología. WSE 3.0 y las aplicaciones WCF son interoperables a nivel de conexión, en función del conjunto de especificaciones WS - * que ambos admitan. Cuando se desarrolla un WSE 3.0 o una aplicación WCF, hay un conjunto común de terminología, como los nombres de las aserciones de seguridad inmediata en WSE y los modos de autenticación.

Aunque existen muchos aspectos similares entre WCF y ASP.NET o los modelos de programación de WSE 3.0, son diferentes. Para obtener más información sobre el modelo de programación WCF, consulte Ciclo de vida de programación básica.

Nota

Para migrar un servicio web de WSE a WCF, se puede usar la herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) para generar un cliente. No obstante, ese cliente contiene interfaces y clases que también pueden usarse como punto inicial para un servicio WCF. Las interfaces que se generan tienen el atributo OperationContractAttribute aplicado a los miembros del contrato con la propiedad ReplyAction establecida en * Cuando un cliente WSE llama a un servicio web con esta configuración, se produce la siguiente excepción: Web.Services3.ResponseProcessingException: WSE910: Se produjo un error durante el procesamiento de un mensaje de respuesta, y puede encontrar el error en la excepción interna. Para mitigar esto, establezca la propiedad ReplyAction del atributo OperationContractAttribute en un valor que no sea null, como http://Microsoft.WCF.Documentation/ResponseToOCAMethod.

Seguridad

Los servicios web WSE 3.0 que se protegen mediante un archivo de directivas

Los servicios WCF pueden usar un archivo de configuración para proteger un servicio y ese mecanismo es similar a un archivo de directivas WSE 3.0. En WSE 3.0, al proteger un servicio web mediante un archivo de directivas, utiliza una aserción de seguridad inmediata o una aserción de directiva personalizada. Las aserciones de seguridad inmediata se asignan estrechamente al modo de autenticación de un elemento de enlace de seguridad WCF. Los modos de autenticación WCF y las aserciones de seguridad inmediata WSE 3.0 no solo tienen el mismo nombre o similar, sino que también protegen los mensajes con los mismos tipos de credenciales. Por ejemplo, la aserción de seguridad inmediata usernameForCertificate en WSE 3.0 se asigna al modo de autenticación UsernameForCertificate en WCF. En los siguientes ejemplos de código se muestra cómo una directiva mínima que usa la aserción de seguridad inmediata usernameForCertificate en WSE 3.0 se asigna a un modo de autenticación UsernameForCertificate en un enlace personalizado WCF.

WSE 3.0

<policies>  
  <policy name="MyPolicy">  
    <usernameForCertificate messageProtectionOrder="SignBeforeEncrypt"  
                            requireDeriveKeys="true"/>  
  </policy>  
</policies>  

WCF

<customBinding>  
  <binding name="MyBinding">  
    <security authenticationMode="UserNameForCertificate"
              messageProtectionOrder="SignBeforeEncrypt"  
              requireDerivedKeys="true"/>  
  </binding>  
</customBinding>  

Para migrar la configuración de seguridad de un servicio web WSE 3.0 que se especifica en un archivo de directiva a WCF, debe crearse un enlace personalizado en un archivo de configuración y la aserción de seguridad inmediata debe establecerse en su modo de autenticación equivalente. Además, el enlace personalizado debe configurarse para que utilice la especificación WS-Addressing de agosto de 2004 cuando los clientes WSE 3.0 se comunican con el servicio. Cuando el servicio WCF migrado no necesita la comunicación con clientes WSE 3.0 y solo debe mantener la paridad de seguridad, considere la posibilidad de usar los enlaces que define el sistema WCF con la configuración de seguridad adecuada en lugar de crear un enlace personalizado.

La siguiente tabla enumera la asignación entre un archivo de directivas WSE 3.0 y el enlace personalizado equivalente en WCF.

Aserción de seguridad inmediata de WSE 3.0 Configuración de enlace personalizado de WCF
<usernameOverTransportSecurity /> <customBinding> <binding name="MyBinding"> <security authenticationMode="UserNameOverTransport" /> <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" /> </binding> </customBinding>
<mutualCertificate10Security /> <customBinding> <binding name="MyBinding"> <security messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10" authenticationMode="MutualCertificate" /> <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" /> </binding> </customBinding>
<usernameForCertificateSecurity /> <customBinding> <binding name="MyBinding"> <security authenticationMode="UsernameForCertificate"/> <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" /> </binding> </customBinding>
<anonymousForCertificateSecurity /> <customBinding> <binding name="MyBinding"> <security authenticationMode="AnonymousForCertificate"/> <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" /> </binding> </customBinding>
<kerberosSecurity /> <customBinding> <binding name="MyBinding"> <security authenticationMode="Kerberos"/> <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" /> </binding> </customBinding>
<mutualCertificate11Security /> <customBinding> <binding name="MyBinding"> <security authenticationMode="MutualCertificate"/> <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" /> </binding> </customBinding>

Para obtener más información sobre la creación de enlaces personalizados, consulte Enlaces personalizados.

Servicios web WSE 3.0 que se protegen mediante código de aplicaciones

Tanto si se usa WSE 3.0 como WCF, los requisitos de seguridad se pueden especificar en el código de la aplicación en lugar de en la configuración. En WSE 3.0, esto se logra creando una clase que derive de la clase Policy y, a continuación, agregando los requisitos llamando al método Add. Para obtener más información sobre cómo especificar los requisitos de seguridad en código, consulte Procedimiento para proteger un servicio web sin usar un archivo de directivas. En WCF, para especificar los requisitos de seguridad en el código, puede crear una instancia de la clase BindingElementCollection y agregue una instancia de SecurityBindingElement a BindingElementCollection. Los requisitos de aserción de seguridad se establecen mediante los métodos de ayuda del modo de autenticación estático de la clase SecurityBindingElement. Para obtener más información sobre la especificación de requisitos de seguridad en el código mediante WCF, consulte Procedimiento para crear un enlace personalizado mediante SecurityBindingElement y Procedimiento para crear un SecurityBindingElement para un modo de autenticación especificado.

Aserción de directivas personalizadas WSE 3.0

En WSE 3.0 hay dos tipos de aserciones de directivas personalizadas: las que protegen un mensaje SOAP y las que no protegen un mensaje SOAP. Las aserciones de directivas que protegen los mensajes SOAP se derivan de la clase SecurityPolicyAssertion WSE 3.0 y el equivalente conceptual en WCF es la clase SecurityBindingElement.

Un punto importante que hay que tener en cuenta es que las aserciones de seguridad inmediata WSE 3.0 son un subconjunto de los modos de autenticación WCF. Si ha creado una aserción de directiva personalizada en WSE 3.0, es posible que haya un modo de autenticación WCF equivalente. Por ejemplo, WSE 3.0 no proporciona ninguna aserción de seguridad de CertificateOverTransport que sea el equivalente a la aserción de seguridad inmediata UsernameOverTransport, pero utiliza un certificado X.509 para la autenticación del cliente. Si ha definido su propia aserción de directiva personalizada para este escenario, WCF facilita la migración. WCF define un modo de autenticación para este escenario, por lo que puede beneficiarse de los métodos del asistente del modo de autenticación estático para configurar un WCFSecurityBindingElement.

Cuando no hay ningún modo de autenticación WCF que sea equivalente a una aserción de directiva personalizada que proteja los mensajes SOAP, derive una clase desde las clases TransportSecurityBindingElement, SymmetricSecurityBindingElement o AsymmetricSecurityBindingElement WCF y especifique el elemento de enlace equivalente. Para obtener más información, consulte Procedimiento para crear un enlace personalizado mediante SecurityBindingElement.

Para convertir una aserción de directiva personalizada que no protege un mensaje SOAP, consulte Filtrado y el ejemplo de interceptor de mensajes personalizado.

Token de seguridad personalizado de WSE 3.0

El modelo de programación WCF para la creación de un token personalizado es diferente al de WSE 3.0. Para obtener más información sobre la creación de un token personalizado en WSE, consulte Creación de tokens de seguridad personalizados. Para obtener más información sobre la creación de un token personalizado en WCF, consulte Procedimiento para crear un token personalizado.

Administrador de tokens personalizados de WSE 3.0

El modelo de programación para la creación de un administrador de tokens personalizado es distinto en WCF que en WSE 3.0. Para obtener más información sobre cómo crear un administrador de tokens personalizado y otros componentes necesarios para un token de seguridad personalizado, consulte Procedimiento para crear un token personalizado.

Nota

Si ha creado un administrador de tokens de seguridad UsernameToken personalizado, WCF proporcionará un mecanismo para especificar la lógica de autenticación más fácil que crear un administrador de tokens de seguridad personalizado. Para obtener más información, consulte Procedimiento para usar un nombre de usuario personalizado y un validador de contraseñas.

Servicio web de WSE 3.0 que usan mensajes SOAP codificados mediante MTOM

Al igual que una aplicación WSE 3, una aplicación WCF puede especificar la codificación de mensajes MTOM en la configuración. Para migrar esta configuración, agregue <mtomMessageEncoding> al enlace del servicio. En el siguiente ejemplo de código se muestra cómo la codificación de MTOM se especifica en WSE 3.0 para un servicio que es equivalente en WCF.

WSE 3.0

<messaging>  
    <mtom clientMode="On"/>  
</messaging>  

WCF

<customBinding>  
  <binding name="MyBinding">  
    <mtomMessageEncoding/>  
  </binding>  
</customBinding>  

Mensajería

Aplicaciones WSE 3.0 que utilizan la API de mensajería WSE

Cuando la API de mensajería WSE se utiliza para obtener acceso directo al XML que se comunica entre el cliente y el servicio web, la aplicación puede convertirse para utilizar XML simple convencional (POX). Para obtener más información sobre POX, consulte Interoperabilidad con aplicaciones POX. Para obtener más información sobre la API de mensajería WSE, consulte Envío y recepción de mensajes SOAP mediante la API de mensajería WSE.

Transportes

TCP

Los clientes y servicios web WSE 3.0 que envían mensajes SOAP mediante transporte TCP no interoperan con clientes y servicios web WCF de forma predeterminada. Esta incompatibilidad se debe a diferencias en el marco utilizado en el protocolo TCP y por cuestiones de rendimiento. No obstante, un ejemplo de WCF detalla cómo se implementa una sesión TCP personalizada que interopera con WSE 3.0. Para obtener más información sobre este ejemplo, consulte Transporte: Interoperabilidad TCP de WSE 3.0.

Para especificar que una aplicación WCF use el transporte TCP, use el <netTcpBinding>.

Transporte personalizado

El equivalente de un transporte personalizado WSE 3.0 en WCF es una extensión de canal. Para obtener más información sobre la creación de una extensión de canal, consulte Extensión de la capa de canales.

Consulte también