Migrando serviços Web de WSE 3.0 para o WCF

Os benefícios da migração dos serviços Web do WSE 3.0 para o WCF (Windows Communication Foundation) incluem melhor desempenho e suporte a transportes adicionais, cenários de segurança adicionais e especificações WS-*. Um serviço Web migrado do WSE 3.0 para o WCF pode ter uma melhoria de desempenho de 200% a 400%. Para obter mais informações sobre os transportes com suporte do WCF, consulte Como escolher um transporte. Para obter uma lista dos cenários com suporte do WCF, consulte Cenários comuns de segurança. Para obter uma lista das especificações compatíveis com o WCF, consulte o Guia de interoperabilidade de protocolos de serviços Web.

As seções a seguir fornecem diretrizes sobre como migrar um recurso específico de um serviço Web WSE 3.0 para o WCF.

Geral

Os aplicativos WSE 3.0 e WCF incluem interoperabilidade com o nível de conexão e um conjunto comum de terminologia. Os aplicativos WSE 3.0 e WCF são interoperáveis no nível de conexão com base no conjunto de especificações WS-* que ambos dão suporte. Quando um aplicativo WSE 3.0 ou WCF é desenvolvido, há um conjunto comum de terminologia, como os nomes das declarações turnkey de segurança no WSE e os modos de autenticação.

Embora os modelos de programação WCF e ASP.NET ou WSE 3.0 sejam semelhantes em muitos aspectos, eles são diferentes. Para obter detalhes sobre o modelo de programação do WCF, consulte Ciclo de vida de programação básica.

Observação

Para migrar um serviço Web WSE para o WCF, a Ferramenta Utilitário de Metadados ServiceModel (Svcutil.exe) pode ser usada para gerar um cliente. No entanto, esse cliente contém interfaces e classes que também podem ser usadas como ponto de partida para um serviço WCF. As interfaces geradas têm o atributo OperationContractAttribute aplicado aos membros do contrato com a propriedade ReplyAction definida como *. Quando um cliente WSE chama um serviço Web com essa configuração, a seguinte exceção é gerada: Web.Services3.ResponseProcessingException: WSE910: ocorreu um erro durante o processamento de uma mensagem de resposta, que pode ser encontrado na exceção interna. Para atenuar isso, defina a propriedade ReplyAction do atributo OperationContractAttribute como um valor diferente de null, como http://Microsoft.WCF.Documentation/ResponseToOCAMethod.

Segurança

Serviços Web WSE 3.0 protegidos usando um arquivo de política

Os serviços WCF podem usar um arquivo de configuração para proteger um serviço e esse mecanismo é semelhante a um arquivo de política do WSE 3.0. No WSE 3.0, ao proteger um serviço Web usando um arquivo de política, você usa uma declaração turnkey de segurança ou uma declaração de política personalizada. As declarações turnkey de segurança são mapeadas de perto para o modo de autenticação de um elemento de associação de segurança do WCF. Não só os modos de autenticação do WCF e as declarações turnkey de segurança do WSE 3.0 são nomeadas da mesma forma ou de forma semelhante, elas protegem as mensagens usando os mesmos tipos de credencial. Por exemplo, a declaração turnkey de segurança usernameForCertificate no WSE 3.0 é mapeada para o modo de autenticação UsernameForCertificate no WCF. Os exemplos de código a seguir demonstram como uma política mínima que usa a declaração turnkey de segurança usernameForCertificate no WSE 3.0 é mapeada para um modo de autenticação UsernameForCertificate no WCF em uma associação personalizada.

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 as configurações de segurança de um serviço Web WSE 3.0 especificado em um arquivo de política para o WCF, uma associação personalizada deve ser criada em um arquivo de configuração e a declaração turnkey de segurança deve ser definida como seu modo de autenticação equivalente. Além disso, a associação personalizada deve ser configurada para usar a especificação de WS-Addressing de agosto de 2004, quando os clientes do WSE 3.0 se comunicam com o serviço. Quando o serviço WCF migrado não exige comunicação com clientes do WSE 3.0 e deve manter apenas a paridade de segurança, considere o uso de associações definidas pelo sistema WCF com configurações de segurança apropriadas em vez de criar uma associação personalizada.

A tabela a seguir lista o mapeamento entre um arquivo de política do WSE 3.0 e a associação personalizada equivalente no WCF.

Declaração turnkey de segurança do WSE 3.0 Configuração de associação personalizada do 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 obter mais informações sobre como criar associações personalizadas no WCF, confira Associações personalizadas.

Serviços Web WSE 3.0 protegidos usando um código de aplicativo

Se o WSE 3.0 ou o WCF for usado, os requisitos de segurança podem ser especificados no código do aplicativo, e não na configuração. No WSE 3.0, isso é feito criando uma classe derivada da classe Policy e, em seguida, adicionando os requisitos chamando o método Add. Para obter detalhes sobre como especificar os requisitos de segurança no código, consulte Como proteger um serviço Web sem usar um arquivo de política. No WCF, para especificar os requisitos de segurança no código, crie uma instância da classe BindingElementCollection e adicione uma instância de SecurityBindingElement ao BindingElementCollection. Os requisitos de declaração de segurança são definidos usando os métodos auxiliares do modo de autenticação estático da classe SecurityBindingElement. Para obter mais detalhes sobre como especificar os requisitos de segurança no código usando o WCF, consulte Como criar uma associação personalizada usando o SecurityBindingElement e Como criar um SecurityBindingElement para um modo de autenticação especificado.

Declaração de política personalizada do WSE 3.0

No WSE 3.0, há dois tipos de declarações de política personalizadas: as que protegem uma mensagem SOAP e as que não protegem uma mensagem SOAP. Declarações de política que protegem mensagens SOAP derivam da classe WSE 3.0 SecurityPolicyAssertion e o equivalente conceitual no WCF é a classe SecurityBindingElement.

Um ponto importante a ser observado é que as declarações turnkey de segurança do WSE 3.0 são um subconjunto dos modos de autenticação do WCF. Se você criou uma declaração de política personalizada no WSE 3.0, pode haver um modo de autenticação WCF equivalente. Por exemplo, o WSE 3.0 não fornece uma declaração de segurança CertificateOverTransport equivalente à declaração turnkey de segurança UsernameOverTransport, mas usa um certificado X.509 para autenticação do cliente. Se você definiu sua própria declaração de política personalizada para esse cenário, o WCF simplificará a migração. O WCF define um modo de autenticação para esse cenário, para que você possa aproveitar os métodos auxiliares do modo de autenticação estática para configurar um WCFSecurityBindingElement.

Quando não houver um modo de autenticação WCF equivalente a uma declaração de política personalizada que protege as mensagens SOAP, derive uma classe das classes WCF TransportSecurityBindingElement, SymmetricSecurityBindingElement ou AsymmetricSecurityBindingElement e especifique o elemento de associação equivalente. Para obter mais informações, consulte Como criar uma associação personalizada utilizando o SecurityBindingElement.

Para converter uma declaração de política personalizada que não proteja uma mensagem SOAP, consulte Filtragem e a amostra Interceptor de mensagem personalizado.

Token de segurança personalizado do WSE 3.0

O modelo de programação do WCF para criar um token personalizado é diferente do WSE 3.0. Para obter detalhes sobre a criação de um token personalizado no WSE, consulte Como criar tokens de segurança personalizados. Para obter detalhes sobre a criação de um token personalizado no WCF, consulte Como criar um token personalizado.

Gerenciador de Token Personalizado do WSE 3.0

O modelo de programação para criar um gerenciador de tokens personalizado é diferente no WCF e no WSE 3.0. Para obter detalhes sobre como criar um gerenciador de tokens personalizado e outros componentes necessários para um token de segurança personalizado, consulte Como criar um token personalizado.

Observação

Se você criou um gerenciador de tokens de segurança personalizado UsernameToken, o WCF fornecerá um mecanismo mais fácil para especificar a lógica de autenticação do que a criação de um gerenciador de tokens de segurança personalizado. Para obter mais informações, consulte Como usar um validador personalizado de nome de usuário e senha.

Serviços Web WSE 3.0 que usam mensagens SOAP codificadas em MTOM

Como um aplicativo WSE 3, um aplicativo WCF pode especificar a codificação de mensagem MTOM na configuração. Para migrar essa configuração, adicione <mtomMessageEncoding> à associação do serviço. O exemplo de código a seguir demonstra como a codificação MTOM é especificada no WSE 3.0 para um serviço equivalente no WCF.

WSE 3.0

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

WCF

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

Mensagens

Aplicativos WSE 3.0 que usam a API de Mensagens do WSE

Quando a API de Mensagens do WSE é usada para obter acesso direto ao XML que é comunicado entre o cliente e o serviço Web, o aplicativo pode ser convertido para usar "XML Antigo Simples" (POX). Para obter detalhes sobre POX, consulte Interoperabilidade com aplicativos POX. Para obter detalhes sobre a API de Mensagens do WSE, consulte Enviar e receber mensagens SOAP usando a API de Mensagens do WSE.

Transportes

TCP

Por padrão, os clientes do WSE 3.0 e serviços Web que enviam mensagens SOAP usando o transporte TCP, não interoperam com clientes WCF e serviços Web. Essa incompatibilidade se deve a diferenças no enquadramento usado no protocolo TCP e por motivos de desempenho. No entanto, uma amostra do WCF detalha como implementar uma sessão TCP personalizada que interopera com o WSE 3.0. Para obter detalhes sobre este exemplo, consulte Transporte: Interoperabilidade TCP do WSE 3.0.

Para especificar que um aplicativo WCF usa o transporte TCP, use <netTcpBinding>.

Transporte personalizado

O equivalente a um transporte personalizado do WSE 3.0 no WCF é uma extensão de canal. Para obter detalhes sobre como criar uma extensão de canal, consulte Estendendo a camada do canal.

Confira também