Compartilhar via


Serviços WCF e ASP.NET

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

Hospedagem do WCF lado a lado com ASP.NET

Os serviços do WCF hospedados nos Serviços de Informações da Internet (IIS) podem estar localizados com páginas .ASPX e serviços Web ASMX dentro de um único e comum Domínio de Aplicaçã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 trabalha lado a lado com o ASP.NET.

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

O runtime HTTP do ASP.NET manipula solicitações ASP.NET, mas não participa do processamento de solicitações destinadas a serviços do WCF, embora esses serviços estejam hospedados na mesma AppDomain que o conteúdo 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:

  • os serviços ASP.NET e 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 do WCF se comportam de forma consistente, independentemente do ambiente de hospedagem e do transporte. O ASP.NET runtime HTTP é 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 entre 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 ASP.NET conteúdo, 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 ASP.NET conteúdo. Exemplos desses recursos incluem o seguinte:

    • HttpContext: Current sempre é null quando acessado de dentro de um serviço WCF. Use RequestContext em seu lugar.

    • 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 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 serão ignoradas para solicitações 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 de 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 da plataforma ASP.NET 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, de forma 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 WCF quando o serviço WCF está em execução no modo de compatibilidade ASP.NET.

  • HttpModuleCollection extensibilidade: como 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, 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 ASP.NET: os serviços WCF são executados usando a identidade atual do thread representado pelo ASP.NET, que pode ser diferente da identidade do processo do IIS se a representação ASP.NET estiver habilitada no aplicativo. Se a personificação do ASP.NET e a personificação do WCF estiverem habilitadas para uma operação específica de serviço, a implementação do serviço acabará sendo executada usando a identidade obtida do WCF.

O modo de compatibilidade ASP.NET do WCF está 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 é definido como padrão para false se não for especificado. O valor indica false que todos os serviços WCF em execução no aplicativo não serão executados no modo de compatibilidade ASP.NET.

Como ASP.NET Modo de Compatibilidade 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 predefinido para este 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 do WCF se comuniquem por protocolos diferentes de HTTP. No entanto, os serviços WCF em execução em aplicativos que habilitaram o modo de compatibilidade do ASP.NET não estão autorizados a 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 do ASP.NET.

Consulte também