Serviços WCF e ASP.NET

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

Hospedando o WCF lado a lado com o ASP.NET

Os serviços do WCF hospedados no IIS (Serviços de Informações da Internet) podem estar localizados com páginas .ASPX e serviços Web ASMX dentro de um domínio de aplicativo único e comum. O ASP.NET fornece serviços comuns de infraestrutura, como gerenciamento do AppDomain e compilação dinâmica para o WCF e o runtime HTTP ASP.NET. A configuração padrão do WCF é lado a lado com o ASP.NET.

Screenshot showing WCF Services and ASP .NET: sharing state.

O runtime HTTP do ASP.NET manipula solicitações ASP.NET, mas não participa do processamento de solicitações destinadas a serviços WCF, embora esses serviços estejam hospedados no mesmo AppDomain que o conteúdo ASP.NET. Em vez disso, o Modelo de Serviço do WCF intercepta as mensagens endereçadas aos serviços WCF e as roteia pela pilha de transporte/canal do WCF.

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

  • O ASP.NET e os serviços WCF podem compartilhar o estado do 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 runtime HTTP do ASP.NET é intencionalmente acoplado ao ambiente de hospedagem do IIS/ASP.NET e à comunicação HTTP. Por outro lado, o WCF foi projetado para se comportar consistentemente em ambientes de hospedagem (o WCF se comporta consistentemente dentro e fora do IIS) e em todo o 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 de HTTP).

  • Em um AppDomain, os recursos implementados pelo runtime HTTP se aplicam a conteúdo do ASP.NET, mas não ao WCF. Muitos recursos específicos de HTTP da plataforma de aplicativos 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 de dentro de um serviço WCF. Use RequestContext em vez disso.

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

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

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

    • Representação ASP.NET: por padrão, as solicitações do WCF sempre são executadas como a identidade de processo do IIS, mesmo que o ASP.NET esteja definido para habilitar a representação usando a opção de configuração <identity impersonate="true" /> de System.Web.

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

Os aplicativos WCF que exigem funcionalidades tradicionalmente fornecidas pelo pipeline HTTP devem considerar o uso dos equivalentes do 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 tenha sido projetado para se comportar consistentemente entre ambientes e transportes de hospedagem, 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 do ASP.NET plataforma de aplicativo Web.

Ao contrário da configuração padrão lado a lado, em que a infraestrutura de hospedagem do WCF intercepta mensagens WCF e as encaminha para fora do pipeline HTTP, os serviços do WCF em execução no modo de compatibilidade ASP.NET participam totalmente do ciclo de vida da solicitação HTTP ASP.NET. No modo de compatibilidade, os serviços do WCF usam o pipeline HTTP por meio de uma implementação de IHttpHandler, semelhante à maneira como as solicitações para páginas ASPX e serviços Web ASMX são tratadas. 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 do 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 do WCF em execução no modo de compatibilidade ASP.NET podem ser seguros anexando ACLs (listas de controle de acesso 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 do WCF quando o serviço WCF está em execução no modo de compatibilidade ASP.NET.

  • Extensibilidade de HttpModuleCollection: como os serviços WCF em execução 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 pode operar em solicitações do WCF antes e depois da invocação do serviço.

  • Representação de ASP.NET: os serviços WCF são executados usando a identidade atual do thread representado ASP.NET, que pode ser diferente da identidade de processo do IIS se ASP.NET representação tiver sido habilitada para o aplicativo. Se representação ASP.NET e a representação do WCF estiverem habilitadas para uma operação de serviço específica, 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>

Esse valor usa false como padrão se não for especificado. O valor de false indica que todos os serviços WCF em execução no aplicativo não serão executados no modo de compatibilidade ASP.NET.

Como o Modo de Compatibilidade do ASP.NET implica a semântica de processamento de solicitações que são fundamentalmente diferentes do padrão do WCF, as implementações de serviço individuais têm a capacidade de controlar se são executadas dentro de um aplicativo para o qual o modo de compatibilidade ASP.NET foi habilitado. Os serviços podem usar o AspNetCompatibilityRequirementsAttribute para indicar se dão suporte ao modo de compatibilidade ASP.NET. O valor padrão desse 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ção
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 protocolos diferentes de HTTP. No entanto, os serviços WCF em execução em aplicativos que habilitaram modo de compatibilidade do ASP.NET não têm permissão para expor pontos de extremidade 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 do ASP.NET para serviços WCF, consulte AspNetCompatibilityRequirementsMode e o exemplo de compatibilidade de ASP.NET.

Confira também