Serviços e ASP.NET WCF
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 no IIS (Serviços de Informações da Internet) podem ser localizados com . Páginas ASPX e serviços Web ASMX dentro de um único domínio de aplicativo comum. ASP.NET fornece serviços de infraestrutura comuns, como gerenciamento de AppDomain e compilação dinâmica para WCF e o tempo de execução HTTP ASP.NET. A configuração padrão para WCF está lado a lado com ASP.NET.
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 de dentro 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 interceta solicitações WCF quando o PostAuthenticateRequest evento é gerado e não retorna o processamento para o pipeline HTTP ASP.NET. Os módulos codificados para intercetar solicitações em estágios posteriores do pipeline não intercetam solicitações WCF.
ASP.NET representação: Por padrão, as solicitações WCF sempre são executadas como a identidade do processo do IIS, mesmo que ASP.NET esteja definida para habilitar a representação usando a opção identity impersonate="true" /> configuration do System.Web<.
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:
OperationContext em vez de HttpContext.
ServiceAuthorizationBehavior em vez da Autorização de Arquivo/URL do ASP.NET.
IDispatchMessageInspector ou canais em camadas personalizados em vez de módulos HTTP.
Representação para cada operação usando WCF em vez de representação System.Web.
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, em que a infraestrutura de hospedagem WCF interceta mensagens WCF e as roteia para fora do pipeline HTTP, ASP.NET os serviços WCF executados no Modo de Compatibilidade participam totalmente do ciclo de vida da solicitação HTTP ASP.NET. No modo de compatibilidade, os serviços WCF usam o pipeline HTTP por meio de uma IHttpHandler implementação, 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 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 Representação: os serviços WCF são executados usando a identidade atual do thread representado ASP.NET, que pode ser diferente da identidade do processo do IIS se ASP.NET representação tiver sido habilitada para o aplicativo. Se ASP.NET representação e a representação 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>
O padrão desse valor é false
se não for especificado. O valor de indica que todos os serviços WCF em execução no aplicativo não serão executados no Modo de false
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 predefinido deste 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] Definiçã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. |
Nota
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 ASP.NET modo de compatibilidade 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 ASP.NET modo de compatibilidade para serviços WCF, consulte AspNetCompatibilityRequirementsMode e o ASP.NET Exemplo de compatibilidade .