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 discute novos recursos que tornam o desenvolvimento de aplicações WCF mais simples.
gRPC como uma alternativa ao WCF
gRPC é uma estrutura RPC moderna que é uma alternativa popular ao WCF. O gRPC é criado com base em HTTP/2, o que fornece uma série de vantagens em relação ao WCF, incluindo:
- Desempenho: gRPC é muito mais eficiente do que o WCF, especialmente para conexões de longa execução.
- Escalabilidade: o gRPC foi projetado para dimensionar para um grande número de clientes e servidores.
- Segurança: o gRPC dá suporte a uma variedade de mecanismos de segurança, incluindo TLS e autenticação.
- Multiplataforma: o gRPC é neutro em plataforma e pode ser usado com uma variedade de linguagens de programação.
Para obter mais informações sobre como desenvolver ou migrar aplicativos WCF para gRPC, consulte:
- Por que recomendamos gRPC para desenvolvedores do WCF
- Comparando WCF com gRPC
- Introdução ao gRPC para desenvolvedores do WCF
Arquivos de configuração gerados simplificados
Quando você adiciona uma referência de serviço no Visual Studio ou usa a ferramenta SvcUtil.exe um arquivo de configuração do cliente é gerado. Nas versões anteriores do WCF, esses arquivos de configuração continham o valor de cada propriedade de associação, mesmo que seu valor seja o valor padrão. No WCF 4.5, os arquivos de configuração gerados contêm apenas as propriedades de associação definidas como um valor não padrão.
Veja a seguir um exemplo de um arquivo de configuração gerado pelo WCF 3.0.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard" maxBufferSize="65536"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192"
maxArrayLength="16384" maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
Veja a seguir um exemplo do mesmo arquivo de configuração gerado pelo WCF 4.5.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
Desenvolvimento de primeiro contrato
O WCF agora tem suporte para desenvolvimento do primeiro contrato. A ferramenta svcutil.exe tem uma opção /serviceContract que permite gerar contratos de serviço e dados de um documento WSDL.
Adicione uma referência de serviço de um projeto de subconjunto portátil
Projetos de subconjunto portátil permitem que os programadores de assembly do .NET mantenham uma única árvore de origem e um sistema de build, enquanto ainda dão suporte a várias implementações do .NET (desktop, Silverlight, Windows Phone e Xbox). Projetos de subconjunto portátil fazem referência apenas a bibliotecas portáteis do .NET que são assemblies que podem ser usados em qualquer implementação do .NET. A experiência do desenvolvedor é a mesma que adicionar uma referência de serviço em qualquer outro aplicativo cliente WCF. Para obter mais informações, consulte Adicionar referência de serviço em um projeto de subconjunto portátil.
Padrão do modo de compatibilidade do ASP.NET alterado
O WCF fornece o modo de compatibilidade do ASP.NET para conceder aos desenvolvedores acesso total aos recursos do pipeline HTTP do ASP.NET ao desenvolver serviços WCF. Para usar este modo, você deve definir o atributo aspNetCompatibilityEnabled como true no elemento <serviceHostingEnvironment> de web.config. Além disso, qualquer serviço neste appDomain precisa ter a propriedade RequirementsMode em seu AspNetCompatibilityRequirementsAttribute definida como Allowed ou Required. Por padrão, AspNetCompatibilityRequirementsAttribute agora está definido como Allowed, e o modelo de aplicativo de serviço WCF padrão define o atributo aspNetCompatibilityEnabled como true. Para obter mais informações, consulte As novidades no Windows Communication Foundation 4.5 e WCF Services e ASP.NET.
Melhorias de streaming
Novo suporte para streaming assíncrono foi adicionado ao WCF. Para habilitar o streaming assíncrono, adicione o comportamento do ponto de extremidade DispatcherSynchronizationBehavior ao host de serviço e defina sua propriedade AsynchronousSendEnabled como
true. Isso pode beneficiar a escalabilidade quando um serviço está enviando mensagens transmitidas para vários clientes que estão lendo lentamente. O WCF não bloqueia mais um thread por cliente e liberará o thread para atender a outro cliente.Foram removidas as limitações em torno do buffer de mensagens quando um serviço está hospedado no IIS. Nas versões anteriores do WCF ao receber uma mensagem para um serviço hospedado pelo IIS que usava a transferência de mensagens de streaming, ASP.NET armazenaria em buffer toda a mensagem antes de enviá-la para o WCF. Isso causaria um grande consumo de memória. Esse buffer foi removido no .NET Framework 4.5 e agora os serviços WCF hospedados pelo IIS podem começar a processar o fluxo de entrada antes que toda a mensagem seja recebida, permitindo assim o streaming verdadeiro. Isso permite que o WCF responda imediatamente às mensagens e permita um melhor desempenho. Além disso, você não precisa mais especificar um valor para
maxRequestLengtho limite de tamanho ASP.NET nas solicitações de entrada. Se essa propriedade for definida, ela será ignorada. Para obter mais informações sobremaxRequestLength, veja o <elemento de configuração httpRuntime>. Você ainda precisará configurar o maxAllowedContentLength, para obter mais informações, consulte os Limites de Solicitação do IIS.
Novos valores padrão de transporte
A tabela a seguir descreve as configurações que foram alteradas e onde encontrar informações adicionais.
| Propriedade | Ligado | Novo padrão | Mais informações |
|---|---|---|---|
| channelInitializationTimeout | NetTcpBinding | 30 segundos | Essa propriedade determina quanto tempo uma conexão TCP pode levar para se autenticar usando o protocolo .NET Framing. Um cliente precisa enviar alguns dados iniciais antes que o servidor tenha informações suficientes para executar a autenticação. Esse tempo limite é intencionalmente menor que o ReceiveTimeout (10 min) para que clientes mal-intencionados não autenticados não mantenham as conexões vinculadas ao servidor por muito tempo. O valor padrão é 30 segundos. Para obter mais informações sobre ChannelInitializationTimeout |
| listenBacklog | NetTcpBinding | 16 * número de processadores | Esta propriedade de nível de soquete descreve o número de solicitações com aceitações pendentes a serem enfileiradas. Se a fila de pendências de escuta for preenchida, as novas solicitações de soquete serão rejeitadas. Para obter mais informações sobre ListenBacklog |
| maxPendingAccepts (número máximo de aceitações pendentes) | ConnectionOrientedTransportBindingElement SMSvcHost.exe |
2 * número de processadores para transporte 4 * número de processadores para SMSvcHost.exe |
Essa propriedade limita o número de canais que o servidor pode ter aguardando em um ouvinte. Quando MaxPendingAccepts for muito baixo, haverá um pequeno intervalo de tempo no qual todos os canais de espera terão ligado conexões de serviços, mas nenhum novo canal terá começado a escutar. Uma conexão pode chegar durante esse intervalo e falhará porque nada está aguardando no servidor. Essa propriedade pode ser configurada definindo a MaxPendingConnections propriedade como um número maior. Para obter mais informações, consulte MaxPendingAccepts e Configurar o Serviço de Compartilhamento de Porta Net.TCP |
| maxPendingConnections | ConnectionOrientedTransportBindingElement | 12 * número de processadores | Esta propriedade controla quantas conexões um transporte aceitou, mas não foram selecionadas pelo Dispatcher do ServiceModel. Para definir esse valor, use MaxConnections na associação ou maxOutboundConnectionsPerEndpoint no elemento de associação. Para obter mais informações sobre MaxPendingConnections |
| receiveTimeout | SMSvcHost.exe | 30 segundos | Esta propriedade especifica o tempo limite para ler os dados do enquadramento de TCP e executar a conexão que distribui de conexões subjacentes. Isso existir para colocar um limite na quantidade de tempo que o serviço SMSvcHost.exe é mantido envolvido para ler os dados do preâmbulo de uma conexão de entrada. Para obter mais informações, consulte Configurar o Serviço de Compartilhamento de Porta Net.TCP. |
Observação
Esses novos padrões serão usados somente se você implantar o serviço WCF em um computador com o .NET Framework 4.5. Se você implantar o mesmo serviço em um computador com o .NET Framework 4.0, os padrões do .NET Framework 4.0 serão usados. Nesses casos, é recomendável definir essas configurações explicitamente.
XmlDictionaryReaderQuotas
XmlDictionaryReaderQuotas contém valores de cota configuráveis para leitores de dicionário XML que limitam a quantidade de memória utilizada por um codificador durante a criação de uma mensagem. Embora essas cotas sejam configuráveis, os valores padrão foram alterados para diminuir a possibilidade de que um desenvolvedor precise defini-las explicitamente.
MaxReceivedMessageSize a cota não foi alterada para que ainda possa limitar o consumo de memória, evitando que você precise lidar com a complexidade do XmlDictionaryReaderQuotas. A tabela a seguir mostra as cotas, seus novos valores padrão e uma breve explicação para o que cada cota é usada.
| Nome da Cota | Valor Padrão | Descrição |
|---|---|---|
| MaxArrayLength | Int32.MaxValue | Obtém e define o tamanho máximo permitido da matriz. Essa cota limita o tamanho máximo de uma matriz de primitivos que o leitor XML retorna, incluindo matrizes de bytes. Essa cota não limita o consumo de memória no próprio leitor XML, mas em qualquer componente que esteja usando o leitor. Por exemplo, quando o DataContractSerializer usa um leitor assegurado com MaxArrayLength, ele não desserializa matrizes de bytes maiores que essa cota. |
| MaxBytesPerRead | Int32.MaxValue | Obtém e define o máximo de bytes permitidos retornados para cada leitura. Essa cota limita o número de bytes lidos em uma única operação de leitura ao ler a marca inicial do elemento e seus atributos. (Em casos não transmitidos, o nome do elemento em si não é contado em relação à cota). Ter muitos atributos XML pode usar um tempo de processamento desproporcional porque os nomes de atributo precisam ser verificados quanto à exclusividade. MaxBytesPerRead atenua essa ameaça. |
| MaxDepth | 128 nós profundos | Essa cota limita a profundidade máxima de aninhamento de elementos XML. MaxDepth interage com MaxBytesPerRead: o leitor sempre mantém dados na memória para o elemento atual e todos os seus ancestrais, portanto, o consumo máximo de memória do leitor é proporcional ao produto dessas duas configurações. Ao desserializar um grafo de objeto aninhado mais profundamente, o desserializador é forçado para acessar a pilha inteira e gerar um StackOverflowException irrecuperável. Existe uma correlação direta entre o aninhamento XML e o aninhamento de objeto, tanto para DataContractSerializer quanto para XmlSerializer. MaxDepth é usado para atenuar essa ameaça. |
| MaxNameTableCharCount | Int32.MaxValue | Essa cota limita o número máximo de caracteres permitido em um nametable. O nametable contém determinadas cadeias de caracteres (como namespaces e prefixos) que são encontradas ao processar um documento XML. Como essas cadeias de caracteres são armazenadas em buffer na memória, essa cota é usada para evitar buffer excessivo quando o streaming é esperado. |
| MaxStringContentLength | Int32.MaxValue | Essa cota limita o tamanho máximo da cadeia de caracteres que o leitor XML retorna. Essa cota não limita o consumo de memória no próprio leitor XML, mas no componente que está usando o leitor. Por exemplo, quando o DataContractSerializer usa um leitor protegido com MaxStringContentLength, ele não desserializa cadeias de caracteres maiores que essa cota. |
Importante
Consulte "Usando XML com segurança" em Considerações de segurança para obter mais informações sobre como proteger seus dados.
Observação
Esses novos padrões serão usados somente se você implantar o serviço WCF em um computador com o .NET Framework 4.5. Se você implantar o mesmo serviço em um computador com o .NET Framework 4.0, os padrões do .NET Framework 4.0 serão usados. Nesses casos, é recomendável definir essas configurações explicitamente.
Validação de configuração do WCF
Como parte do processo de build no Visual Studio, os arquivos de configuração do WCF agora são validados. Uma lista de erros ou avisos de validação será exibida no Visual Studio se a validação falhar.
Dicas de ferramentas do Editor XML
Para ajudar os desenvolvedores de serviços WCF novos e existentes a configurar seus serviços, o editor do Visual Studio XML agora fornece dicas de ferramentas para cada elemento de configuração e suas propriedades que fazem parte do arquivo de configuração de serviço.
Melhorias no BasicHttpBinding
Permite que um único endpoint WCF responda a diferentes modos de autenticação.
Permite que as configurações de segurança de um serviço WCF sejam controladas pelo IIS