Partilhar via


Serviços WCF e ASP.NET

Este tópico discute a hospedagem de serviços do Windows Communication Foundation (WCF) lado a lado com ASP.NET e a hospedagem deles no modo de compatibilidade ASP.NET.

Hospedando o WCF lado a lado com ASP.NET

Os serviços WCF hospedados nos Serviços de Informações da Internet (IIS) podem ser encontrados juntamente com páginas .ASPX e serviços Web ASMX dentro de um único domínio comum de aplicação. ASP.NET fornece serviços de infraestrutura comuns, como gestão de AppDomain e compilação dinâmica para WCF e a execução HTTP do ASP.NET. A configuração padrão para WCF está lado a lado com ASP.NET.

Captura de tela mostrando Serviços WCF e ASP .NET: estado de compartilhamento.

O tempo de execução HTTP ASP.NET lida com solicitações ASP.NET, mas não participa do processamento de solicitações destinadas a serviços WCF, mesmo que esses serviços estejam hospedados no mesmo AppDomain que é o conteúdo ASP.NET. Em vez disso, o modelo de serviço WCF interceta mensagens endereçadas aos serviços WCF e as encaminha através da pilha de transporte/canal do WCF.

Os resultados do modelo lado a lado são os seguintes:

  • Os serviços ASP.NET e WCF podem compartilhar o estado AppDomain. Como as duas estruturas podem coexistir no mesmo AppDomain, o WCF também pode compartilhar o estado AppDomain com ASP.NET (incluindo variáveis estáticas, eventos e assim por diante).

  • Os serviços WCF se comportam de forma consistente, independentemente do ambiente de hospedagem e do transporte. O tempo de execução HTTP ASP.NET é intencionalmente acoplado ao ambiente de hospedagem IIS/ASP.NET e à comunicação HTTP. Por outro lado, o WCF foi projetado para se comportar de forma consistente em ambientes de hospedagem (o WCF se comporta consistentemente dentro e fora do IIS) e no transporte (um serviço hospedado no IIS 7.0 e posterior tem um comportamento consistente em todos os pontos de extremidade que expõe, mesmo que alguns desses pontos de extremidade usem protocolos diferentes do HTTP).

  • Dentro de um AppDomain, os recursos implementados pelo tempo de execução HTTP se aplicam ao conteúdo ASP.NET, mas não ao WCF. Muitos recursos específicos de HTTP da plataforma de aplicativo ASP.NET não se aplicam aos Serviços WCF hospedados dentro de um AppDomain que contém conteúdo ASP.NET. Exemplos desses recursos incluem o seguinte:

    • HttpContext: Current é sempre null quando acessado a partir de um serviço WCF. Utilize RequestContext em substituição.

    • Autorização baseada em arquivo: O modelo de segurança WCF não permite a lista de controle de acesso (ACL) aplicada ao arquivo .svc do serviço ao decidir se uma solicitação de serviço é autorizada.

    • Autorização de URL baseada em configuração: Da mesma forma, o modelo de segurança WCF não adere a nenhuma regra de autorização baseada em URL especificada no elemento de configuração de <autorização> do System.Web. Essas configurações são ignoradas para solicitações WCF se um serviço reside em um espaço de URL protegido pelas regras de autorização de URL do ASP.NET.

    • Extensibilidade HttpModule: A infraestrutura de hospedagem WCF intercepta solicitações WCF quando o evento PostAuthenticateRequest é gerado e não retorna o processamento para o pipeline HTTP do ASP.NET. Os módulos codificados para intercetar solicitações em estágios posteriores do pipeline não intercetam solicitações WCF.

    • ASP.NET imitação: Por padrão, as solicitações WCF são sempre executadas com a identidade do processo do IIS, mesmo que o ASP.NET esteja configurado para permitir a imitação usando a opção de configuração do System.Web <identity impersonate="true">.

Essas restrições se aplicam somente aos serviços WCF hospedados no aplicativo IIS. O comportamento de ASP.NET conteúdo não é afetado pela presença de WCF.

Os aplicativos WCF que exigem funcionalidade tradicionalmente fornecida pelo pipeline HTTP devem considerar o uso dos equivalentes WCF, que são independentes de host e transporte:

Como alternativa, você pode considerar a execução de seus serviços no modo de compatibilidade ASP.NET do WCF.

Hospedagem de serviços WCF no modo de compatibilidade ASP.NET

Embora o modelo WCF seja projetado para se comportar de forma consistente em ambientes de hospedagem e transportes, geralmente há cenários em que um aplicativo não requer esse grau de flexibilidade. O modo de compatibilidade ASP.NET do WCF é adequado para cenários que não exigem a capacidade de hospedar fora do IIS ou de se comunicar por protocolos diferentes de HTTP, mas que usam todos os recursos da plataforma de aplicativo Web ASP.NET.

Ao contrário da configuração lado-a-lado padrão, na qual a infraestrutura de hospedagem WCF interceta as mensagens WCF e as roteia para fora do pipeline HTTP, os serviços WCF executados no Modo de Compatibilidade ASP.NET participam totalmente do ciclo de vida da solicitação HTTP do ASP.NET. No modo de compatibilidade, os serviços WCF utilizam o pipeline HTTP através de uma implementação IHttpHandler, semelhante à forma como são tratadas as solicitações para páginas ASPX e serviços Web ASMX. Como resultado, o WCF se comporta de forma idêntica ao ASMX em relação aos seguintes recursos de ASP.NET:

  • HttpContext: Os serviços WCF em execução no Modo de Compatibilidade ASP.NET podem acessar Current e seu estado associado.

  • Autorização baseada em arquivo: os serviços WCF executados no modo de compatibilidade ASP.NET podem ser seguros anexando listas de controle de acesso (ACLs) do sistema de arquivos ao arquivo .svc do serviço.

  • Autorização de URL configurável: as regras de autorização de URL do ASP.NET são impostas para solicitações WCF quando o serviço WCF está sendo executado no Modo de Compatibilidade ASP.NET.

  • HttpModuleCollection extensibilidade: Como os serviços WCF executados no Modo de Compatibilidade ASP.NET participam totalmente do ciclo de vida da solicitação HTTP ASP.NET, qualquer módulo HTTP configurado no pipeline HTTP é capaz de operar em solicitações WCF antes e depois da chamada de serviço.

  • ASP.NET Impersonação: os serviços WCF são executados usando a identidade atual do thread fictício do ASP.NET, que pode ser diferente da identidade do processo do IIS caso a impersonação ASP.NET tenha sido ativada para a aplicação. Se a representação de identidade do ASP.NET e a do WCF estiverem ativas para uma operação específica de serviço, a implementação do serviço será executada usando a identidade obtida do WCF.

O modo de compatibilidade ASP.NET do WCF é habilitado no nível do aplicativo por meio da seguinte configuração (localizada no arquivo Web.config do aplicativo):

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

O padrão desse valor é false se não for especificado. O valor de false indica que todos os serviços WCF em execução na aplicação não serão executados no modo de compatibilidade ASP.NET.

Como ASP.NET Modo de Compatibilidade implica semânticas de processamento de solicitação que são fundamentalmente diferentes do padrão WCF, implementações de serviço individuais têm a capacidade de controlar se são executadas dentro de um aplicativo para o qual ASP.NET Modo de Compatibilidade foi habilitado. Os serviços podem usar o AspNetCompatibilityRequirementsAttribute para indicar se suportam ASP.NET Modo de Compatibilidade. O valor padrão para esse atributo é Allowed.

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}

A tabela a seguir ilustra como a configuração do modo de compatibilidade em todo o aplicativo interage com o nível de suporte declarado do serviço individual:

Configuração do Modo de Compatibilidade em todo o aplicativo [AspNetCompatibilityRequirementsMode]

Configurações
Resultado observado
aspNetCompatibilityEnabled = "true" Required O serviço é ativado com êxito.
aspNetCompatibilityEnabled = "true" Allowed O serviço é ativado com êxito.
aspNetCompatibilityEnabled = "true" NotAllowed Um erro de ativação ocorre quando o serviço recebe uma mensagem.
aspNetCompatibilityEnabled = "false" Required Um erro de ativação ocorre quando o serviço recebe uma mensagem.
aspNetCompatibilityEnabled = "false" Allowed O serviço é ativado com êxito.
aspNetCompatibilityEnabled = "false" NotAllowed O serviço é ativado com êxito.

Observação

O IIS 7.0 e o WAS permitem que os serviços WCF se comuniquem por meio de protocolos diferentes do HTTP. No entanto, os serviços WCF em execução em aplicativos que habilitaram o modo de compatibilidade ASP.NET não estão autorizados a expor endpoints não-HTTP. Essa configuração gera uma exceção de ativação quando o serviço recebe sua primeira mensagem.

Para obter mais informações sobre como habilitar o modo de compatibilidade ASP.NET para serviços WCF, consulte AspNetCompatibilityRequirementsMode e o Exemplo de Compatibilidade ASP.NET.

Ver também