Aplicativos cliente de camada intermediária
Este tópico aborda vários problemas específicos para aplicativos cliente de camada intermediária que usam o WCF (Windows Communication Foundation).
Aumentando o desempenho do cliente de camada intermediária
Em comparação com tecnologias de comunicação anteriores, como serviços Web que usam ASP.NET, a criação de uma instância de cliente do WCF pode ser mais complexa devido ao conjunto de recursos avançado do WCF. Por exemplo, quando um objeto ChannelFactory<TChannel> é aberto, ele pode estabelecer uma sessão segura com o serviço, um procedimento que aumenta o tempo de inicialização da instância do cliente. Normalmente, esses recursos adicionais não afetam muito os aplicativos cliente, pois o cliente do WCF faz várias chamadas e fecha.
Os aplicativos cliente de camada intermediária, no entanto, podem criar muitos objetos de cliente WCF rapidamente e, como resultado, ter requisitos de inicialização maiores. Há duas abordagens principais para aumentar o desempenho de aplicativos de camada intermediária ao chamar serviços:
Armazene o objeto cliente WCF em cache e reutilize-o para chamadas subsequentes sempre que possível.
Crie um objeto ChannelFactory<TChannel> e use-o para criar novos objetos de canal de cliente do WCF para cada chamada.
Os problemas a serem considerados ao usar essas abordagens incluem:
Se o serviço mantiver um estado específico do cliente usando uma sessão, você não poderá reutilizar o cliente WCF de camada intermediária com solicitações de camada de vários clientes porque o estado do serviço está vinculado ao do cliente de camada intermediária.
Se o serviço precisar executar a autenticação por cliente, você precisará criar um novo cliente para cada solicitação de entrada na camada intermediária em vez de reutilizar o cliente WCF de camada intermediária (ou objeto de canal do cliente WCF), porque as credenciais do cliente da camada intermediária não podem ser modificadas após a criação do cliente WCF (ou ChannelFactory<TChannel>) .
Embora os canais e clientes criados pelos canais sejam thread-safe, eles podem não permitir gravação de mais de uma mensagem na transmissão simultaneamente. Se você estiver enviando mensagens grandes, especialmente se houver streaming, a operação de envio poderá bloquear a espera da conclusão de outro envio. Isso causa dois tipos de problemas: a falta de simultaneidade e a possibilidade de deadlock se o fluxo de controle retornar ao serviço reutilizando o canal (ou seja, o cliente compartilhado chama um serviço cujo caminho de código resulta em um retorno de chamada para o cliente compartilhado). Isso é verdadeiro, independentemente do tipo de cliente WCF que você reutilizar.
Você precisa lidar com canais com falha, independentemente de compartilhar o canal. No entanto, quando os canais são reutilizados, um canal com falha pode derrubar mais de uma solicitação ou envio pendente.
Para ver um exemplo que demonstra as práticas recomendadas para reutilizar um cliente para várias solicitações, consulte Associação de Dados em um cliente ASP.NET.
Além disso, você pode melhorar o desempenho de inicialização desses clientes que usam tipos de dados serializados usando XmlSerializer, geram e compilam o código de serialização para esses tipos de dados em tempo de execução, o que pode levar a um desempenho lento da inicialização. A Ferramenta do Utilitário de Metadados ServiceModel (Svcutil.exe) pode melhorar o desempenho da inicialização desses aplicativos, gerando o código de serialização necessário dos assemblies compilados do aplicativo. Para obter mais informações, confira Como melhorar o tempo de inicialização dos aplicativos cliente do WCF usando o XmlSerializer.