Aplicativos cliente de camada intermediária

Este tópico discute vários problemas específicos para aplicativos cliente de camada intermediária que usam o Windows Communication Foundation (WCF).

Aumentando o desempenho do cliente de nível intermediário

Em comparação com tecnologias de comunicação anteriores, como serviços Web usando ASP.NET, a criação de uma instância de cliente WCF pode ser mais complexa devido ao rico conjunto de recursos do WCF. Por exemplo, quando um ChannelFactory<TChannel> objeto é 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, uma vez que o cliente WCF faz várias chamadas e, em seguida, fecha.

Aplicativos cliente de camada intermediária, no entanto, podem criar muitos objetos de cliente WCF rapidamente e, como resultado, experimentar maiores requisitos de inicialização. Há duas abordagens principais para aumentar o desempenho de aplicativos de camada intermediária ao chamar serviços:

  • Armazene em cache o objeto de cliente WCF e reutilize-o para chamadas subsequentes sempre que possível.

  • Crie um ChannelFactory<TChannel> objeto e, em seguida, use esse objeto para criar novos objetos de canal de cliente WCF para cada chamada.

As questões a considerar ao usar essas abordagens incluem:

  • Se o serviço estiver mantendo 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 deve executar a autenticação por cliente, você deve 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 suportar a gravação simultânea de mais de uma mensagem no fio. Se você estiver enviando mensagens grandes, especialmente se estiver transmitindo, a operação de envio pode bloquear a espera pela conclusão de outro envio. Isso causa dois tipos de problemas: a falta de simultaneidade e a possibilidade de impasse 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ê reutiliza.

  • Você deve lidar com canais com defeito, independentemente de compartilhar o canal. Quando os canais são reutilizados, no entanto, um canal com falha pode derrubar mais de uma solicitação ou envio pendente.

Para obter um exemplo que demonstra as práticas recomendadas para reutilizar um cliente para várias solicitações, consulte Vinculação de dados em um cliente ASP.NET.

Além disso, você pode aumentar o desempenho de inicialização para os clientes que usam tipos de dados que são serializáveis usando o código de serialização gerar e compilar para esses tipos de dados em tempo de execução, o XmlSerializer que pode resultar em desempenho de inicialização lento. A ServiceModel Metadata Utility Tool (Svcutil.exe) pode melhorar o desempenho de inicialização para esses aplicativos gerando o código de serialização necessário dos assemblies compilados para o aplicativo. Para obter mais informações, consulte Como: Melhorar o tempo de inicialização de aplicativos cliente WCF usando o XmlSerializer.

Consulte também