Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tópico descreve várias propriedades em diferentes áreas da arquitetura do WCF (Windows Communication Foundation) que funcionam para controlar o consumo de recursos e afetar as métricas de desempenho.
Propriedades que restringem o consumo de recursos no WCF
O WCF (Windows Communication Foundation) aplica restrições a determinados tipos de processos para fins de segurança ou desempenho. Elas se apresentam, principalmente, de duas formas: cotas e restrições. Cotas são limites que, quando alcançados ou excedidos, disparam uma exceção imediata em algum ponto do sistema. Restrições são limites que impedem que uma exceção seja lançada imediatamente. Em vez disso, quando um limite de restrição é alcançado, o processamento continua, mas dentro dos limites definidos por esse valor de restrição. Esse processamento limitado pode disparar uma exceção em outro lugar, mas isso depende do aplicativo.
Além da distinção entre cotas e restrições, algumas propriedades de restrição estão localizadas no nível de serialização, algumas no nível de transporte e outras no nível do aplicativo. Por exemplo, a cota TransportBindingElement.MaxReceivedMessageSize, que é implementada por todos os elementos de associação de transporte fornecidos pelo sistema, é definida como 65.536 bytes por padrão para impedir que clientes mal-intencionados se envolvam em ataques de negação de serviço contra um serviço, causando consumo excessivo de memória. (Normalmente, você pode aumentar o desempenho reduzindo esse valor.)
Um exemplo de uma cota de serialização é a DataContractSerializer.MaxItemsInObjectGraph propriedade, que especifica o número máximo de objetos que o serializador serializa ou desserializa em uma única ReadObject chamada de método. Um exemplo de restrição no aplicativo é a propriedade ServiceThrottle.MaxConcurrentSessions, que, por padrão, restringe o número de conexões simultâneas de canal de sessão para 10. (Ao contrário das cotas, se esse valor de limitação for atingido, o aplicativo continuará processando, mas não aceitará novos canais com sessão, o que significa que novos clientes não poderão se conectar até que um dos outros canais de sessão seja encerrado.)
Esses controles foram projetados para fornecer uma mitigação pronta para uso em relação a determinados tipos de ataques ou para melhorar as métricas de desempenho, como volume de memória, tempo de inicialização e assim por diante. No entanto, dependendo do aplicativo, esses controles podem impedir o desempenho do aplicativo de serviço ou impedir que o aplicativo funcione. Por exemplo, um aplicativo projetado para transmitir vídeo pode facilmente exceder a propriedade padrão TransportBindingElement.MaxReceivedMessageSize . Este tópico fornece uma visão geral dos vários controles aplicados a aplicativos em todos os níveis do WCF, descreve várias maneiras de obter mais informações sobre se uma configuração está dificultando seu aplicativo e descreve maneiras de corrigir vários problemas. A maioria das restrições e algumas cotas estão disponíveis no aplicativo, mesmo quando a propriedade básica é uma restrição de serialização ou transporte. Por exemplo, você pode definir a DataContractSerializer.MaxItemsInObjectGraph propriedade usando a ServiceBehaviorAttribute.MaxItemsInObjectGraph propriedade na classe de serviço.
Observação
Se você tiver um problema específico, primeiro deve ler o Início Rápido de Solução de Problemas do WCF para ver se o problema (e uma solução) está listado lá.
As propriedades que restringem os processos de serialização são listadas em Considerações de Segurança para Dados. As propriedades que restringem o consumo de recursos relacionados aos transportes são listadas em Cotas de Transporte. As propriedades que restringem o consumo de recursos na camada de aplicativo são os membros da ServiceThrottle classe.
Detectando problemas de aplicativo e desempenho relacionados às configurações de cota
Os padrões dos valores anteriores foram escolhidos para habilitar a funcionalidade básica do aplicativo em uma ampla gama de tipos de aplicativos, fornecendo proteção básica contra problemas comuns de segurança. No entanto, designs de aplicativos diferentes podem exceder uma ou mais configurações de restrição, embora o aplicativo seja seguro e funcione como projetado. Nesses casos, você deve identificar quais valores de restrição estão sendo excedidos e em que nível e decidir sobre o curso de ação apropriado para aumentar a taxa de transferência do aplicativo.
Normalmente, ao escrever o aplicativo e depurá-lo, você define a propriedade ServiceDebugBehavior.IncludeExceptionDetailInFaults como true no arquivo de configuração ou programaticamente. Isso instrui o WCF a retornar rastreamentos de pilha de exceção de serviço para o aplicativo cliente para exibição. Esse recurso relata a maioria das exceções no nível do aplicativo de modo a exibir quais configurações de cota podem estar envolvidas, se esse for o problema.
Algumas exceções ocorrem em runtime abaixo da visibilidade da camada do aplicativo e não são retornadas usando esse mecanismo e podem não ser tratadas por uma implementação personalizada System.ServiceModel.Dispatcher.IErrorHandler . Se você estiver em um ambiente de desenvolvimento como o Microsoft Visual Studio, a maioria dessas exceções será exibida automaticamente. No entanto, algumas exceções podem ser mascaradas por configurações de ambiente de desenvolvimento, como Just My Code Visual Studio.
Independentemente dos recursos do seu ambiente de desenvolvimento, você pode usar recursos de rastreamento do WCF e registro em log de mensagens para depurar todas as exceções e ajustar o desempenho de seus aplicativos. Para obter mais informações, consulte Como usar o rastreamento para solucionar problemas de seu aplicativo.
Problemas de desempenho e XmlSerializer
Serviços e aplicativos cliente que utilizam tipos de dados serializáveis com o XmlSerializer geram e compilam o código de serialização para esses tipos de dados durante o tempo de execução, o que pode resultar em um desempenho lento de inicialização.
Observação
O código de serialização pré-gerado só pode ser usado em aplicativos cliente e não em serviços.
A Ferramenta de Utilitário de Metadados do ServiceModel (Svcutil.exe) pode melhorar o desempenho de inicialização desses 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.
Problemas de desempenho ao hospedar serviços WCF em ASP.NET
Quando um serviço WCF é hospedado em IIS e ASP.NET, as configurações do IIS e ASP.NET podem afetar a taxa de transferência e o volume de memória do serviço WCF. Para obter mais informações sobre ASP.NET desempenho, consulte Como melhorar o desempenho do ASP.NET. Uma configuração que pode ter consequências não intencionais é MinWorkerThreads, que é uma propriedade do ProcessModelSection. Se o aplicativo tiver um número fixo ou pequeno de clientes, a configuração MinWorkerThreads como 2 poderá fornecer um aumento de taxa de transferência em um computador multiprocessador que tenha uma utilização de CPU perto de 100%. Esse aumento no desempenho vem com um custo: isso também causará um aumento no uso da memória, o que poderia reduzir a escalabilidade.