Partager via


Fonctionnalités de simplification WCF

Cette rubrique décrit les nouvelles fonctionnalités qui simplifient l’écriture d’applications WCF.

gRPC comme alternative à WCF

gRPC est une infrastructure RPC moderne qui est une alternative populaire à WCF. gRPC est basé sur HTTP/2, qui offre un certain nombre d’avantages par rapport à WCF, notamment :

  • Performances : gRPC est beaucoup plus efficace que WCF, en particulier pour les connexions longues.
  • Scalabilité : gRPC est conçu pour s’adapter à un grand nombre de clients et de serveurs.
  • Sécurité : gRPC prend en charge divers mécanismes de sécurité, notamment TLS et l’authentification.
  • Multiplateforme : gRPC est neutre sur la plateforme et peut être utilisé avec divers langages de programmation.

Pour plus d’informations sur le développement ou la migration d’applications WCF vers gRPC, consultez :

Fichiers de configuration générés simplifiés

Lorsque vous ajoutez une référence de service dans Visual Studio ou utilisez l’outil SvcUtil.exe un fichier de configuration client est généré. Dans les versions précédentes de WCF, ces fichiers de configuration contenaient la valeur de chaque propriété de liaison, même si sa valeur est la valeur par défaut. Dans WCF 4.5, les fichiers de configuration générés contiennent uniquement les propriétés de liaison définies sur une valeur non par défaut.

Voici un exemple de fichier de configuration généré par 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>

Voici un exemple du même fichier de configuration généré par 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>

Contract-First Développement

WCF prend désormais en charge le développement axé sur les contrats. L’outil svcutil.exe a un commutateur /serviceContract qui vous permet de générer des contrats de service et de données à partir d’un document WSDL.

Ajouter une référence de service à partir d’un projet de sous-ensemble portable

Les projets de sous-ensemble portable permettent aux programmeurs d’assembly .NET de conserver une arborescence source unique et de créer un système tout en prenant en charge plusieurs implémentations .NET (bureau, Silverlight, Windows Phone et Xbox). Les projets de sous-ensemble portable référencent uniquement les bibliothèques portables .NET qui sont des assemblys qui peuvent être utilisés sur n’importe quelle implémentation .NET. L’expérience du développeur est la même que l’ajout d’une référence de service au sein d’une autre application cliente WCF. Pour plus d’informations, consultez Ajouter une référence de service dans un projet de sous-ensemble portable.

ASP.NET mode de compatibilité par défaut modifié

WCF fournit ASP.NET mode de compatibilité pour accorder aux développeurs un accès complet aux fonctionnalités du pipeline HTTP ASP.NET lors de l’écriture de services WCF. Pour utiliser ce mode, vous devez définir l’attribut aspNetCompatibilityEnabled sur true dans la <section serviceHostingEnvironment> de web.config. En outre, tout service de ce appDomain doit avoir la RequirementsMode propriété sur sa AspNetCompatibilityRequirementsAttribute valeur définie Allowed ou Required. Par défaut, AspNetCompatibilityRequirementsAttribute est maintenant défini sur Allowed, et le modèle d’application de service WCF par défaut définit l’attribut aspNetCompatibilityEnabled sur true. Pour plus d’informations, consultez Nouveautés de Windows Communication Foundation 4.5 et services WCF et ASP.NET.

Améliorations apportées à la diffusion en continu

  • La nouvelle prise en charge de la diffusion en continu asynchrone a été ajoutée à WCF. Pour activer la diffusion en continu asynchrone, ajoutez le comportement de point de terminaison DispatcherSynchronizationBehavior à l’hôte de service et affectez à sa propriété AsynchronousSendEnabled la valeur true. Cela peut bénéficier de l’extensibilité lorsqu’un service envoie des messages diffusés en continu à plusieurs clients qui lisent lentement. WCF ne bloque plus un thread par client et libère le thread pour le service d’un autre client.

  • Suppression des limitations relatives à la mise en mémoire tampon des messages lorsqu’un service est hébergé par IIS. Dans les versions précédentes de WCF, lors de la réception d’un message pour un service hébergé par IIS qui utilisait le transfert de messages par diffusion continue, ASP.NET mettait en mémoire tampon l’intégralité du message avant de l’envoyer à WCF. Cela entraînerait une grande consommation de mémoire. Cette mise en mémoire tampon a été supprimée dans .NET Framework 4.5 et les services WCF hébergés par IIS peuvent commencer à traiter le flux entrant avant la réception du message entier, ce qui permet la diffusion en continu réelle. Cela permet à WCF de répondre immédiatement aux messages et d’améliorer les performances. En outre, vous n’avez plus besoin de spécifier de valeur pour maxRequestLength, la limite de taille ASP.NET sur les demandes entrantes. Si cette propriété est définie, elle est ignorée. Pour plus d’informations concernant maxRequestLength, consultez l’élément de configuration <httpRuntime>. Vous devrez toujours configurer le maxAllowedContentLength, pour plus d’informations, voir Limites des requêtes IIS.

Nouveaux paramètres par défaut de transport

Le tableau suivant décrit les paramètres qui ont changé et où trouver des informations supplémentaires.

Propriété Sur Nouvelle valeur par défaut Plus d’informations
channelInitializationTimeout NetTcpBinding 30 secondes Cette propriété détermine la durée pendant laquelle une connexion TCP peut prendre pour s’authentifier à l’aide du protocole .NET Framework. Un client doit envoyer des données initiales avant que le serveur dispose de suffisamment d’informations pour effectuer l’authentification. Ce délai d’expiration est intentionnellement plus petit que le ReceiveTimeout (10 min) afin que les clients non authentifiés malveillants ne conservent pas les connexions liées au serveur pendant longtemps. La valeur par défaut est de 30 secondes. Pour plus d’informations sur ChannelInitializationTimeout
listenBacklog NetTcpBinding 16 * nombre de processeurs Cette propriété au niveau du socket décrit le nombre de demandes d'« acceptation en attente » à mettre en file d’attente. Si la file d’attente du backlog d’écoute est remplie, les nouvelles demandes de socket sont rejetées. Pour plus d’informations sur ListenBacklog
maxPendingAccepts ConnectionOrientedTransportBindingElement

SMSvcHost.exe
2 * nombre de processeurs pour le transport

4 * nombre de processeurs pour SMSvcHost.exe
Cette propriété limite le nombre de canaux que le serveur peut avoir en attente sur un écouteur. Lorsque MaxPendingAccepts est trop faible, il y aura un petit intervalle de temps pendant lequel tous les canaux en attente ont commencé à prendre en charge les connexions, mais aucun nouveau canal n'a encore commencé à écouter. Une connexion peut arriver pendant cet intervalle et échouera, car rien n’attend sur le serveur. Cette propriété peut être configurée en définissant la MaxPendingConnections propriété sur un nombre plus grand. Pour plus d’informations, consultez MaxPendingAccepts et configuration du service de partage de ports Net.TCP
maxPendingConnections ConnectionOrientedTransportBindingElement 12 * nombre de processeurs Cette propriété contrôle le nombre de connexions acceptées par un transport mais qui n'ont pas été récupérées par le ServiceModel Dispatcher. Pour définir cette valeur, utilisez-la MaxConnections sur la liaison ou maxOutboundConnectionsPerEndpoint sur l’élément de liaison. Pour plus d’informations sur MaxPendingConnections
receiveTimeout SMSvcHost.exe 30 secondes Cette propriété spécifie le délai d'attente pour lire les données d'encadrement TCP et effectuer la distribution de la connexion à partir des connexions sous-jacentes. Cela existe pour limiter la durée pendant laquelle le service SMSvcHost.exe est mobilisé pour lire les données du préambule d’une connexion entrante. Pour plus d’informations, consultez Configuration du service de partage de ports Net.TCP.

Remarque

Ces nouvelles valeurs par défaut sont utilisées uniquement si vous déployez le service WCF sur une machine avec .NET Framework 4.5. Si vous déployez le même service sur un ordinateur avec .NET Framework 4.0, les valeurs par défaut du .NET Framework 4.0 sont utilisées. Dans ce cas, il est recommandé de configurer ces paramètres explicitement.

XmlDictionaryReaderQuotas

XmlDictionaryReaderQuotas contient des valeurs de quota configurables pour les lecteurs de dictionnaire XML qui limitent la quantité de mémoire utilisée par un encodeur lors de la création d’un message. Bien que ces quotas soient configurables, les valeurs par défaut ont changé pour réduire la possibilité qu’un développeur doit les définir explicitement. Le quota MaxReceivedMessageSize n’a pas été modifié afin de pouvoir continuer à limiter la consommation de mémoire et vous éviter d’avoir à gérer la complexité du paramètre XmlDictionaryReaderQuotas. Le tableau suivant présente les quotas, leurs nouvelles valeurs par défaut et une brève explication de ce que chaque quota est utilisé.

Nom du quota Valeur par défaut Descriptif
MaxArrayLength Int32.MaxValue Obtient et définit la longueur maximale autorisée du tableau. Ce quota limite la taille maximale d’un tableau de primitives que le lecteur XML retourne, y compris les tableaux d’octets. Ce quota ne limite pas la consommation de mémoire dans le lecteur XML lui-même, mais dans le composant qui utilise le lecteur. Par exemple, lorsque le DataContractSerializer utilise un lecteur sécurisé avec MaxArrayLength, il ne désérialise pas les tableaux d'octets plus grands que ce quota.
MaxBytesPerRead Int32.MaxValue Obtient et définit les octets autorisés maximum retournés pour chaque lecture. Ce quota limite le nombre d’octets lus dans une seule opération de lecture lors de la lecture de la balise de début de l’élément et de ses attributs. (Dans les cas non diffusés en continu, le nom de l’élément lui-même n’est pas comptabilisé par rapport au quota). L’utilisation d’un trop grand nombre d’attributs XML peut utiliser une durée de traitement disproportionnée, car les noms d’attributs doivent être vérifiés pour l’unicité. MaxBytesPerRead atténue cette menace.
MaxDepth 128 nœuds profonds Ce quota limite la profondeur maximale d’imbrication des éléments XML. MaxDepth interagit avec MaxBytesPerRead: le lecteur conserve toujours les données en mémoire de l’élément actuel et de tous ses ancêtres, de sorte que la consommation maximale de mémoire du lecteur est proportionnelle au produit de ces deux paramètres. Lors de la désérialisation d'un graphique d'objets très imbriqué, le désérialiseur est obligé d'accéder à la pile entière et de lever une exception StackOverflowExceptionirrécupérable. Une corrélation directe existe entre l’imbrication XML et l’imbrication d’objets pour les éléments DataContractSerializer et XmlSerializer. MaxDepth est utilisé pour atténuer cette menace.
MaxNameTableCharCount Int32.MaxValue Ce quota limite le nombre maximal de caractères autorisés dans une table de noms. La table de noms contient certaines chaînes (telles que les espaces de noms et les préfixes) rencontrées lors du traitement d’un document XML. Comme ces chaînes sont mises en mémoire tampon, ce quota est utilisé pour empêcher une mise en mémoire tampon excessive lorsque la diffusion en continu est attendue.
MaxStringContentLength Int32.MaxValue Ce quota limite la taille de chaîne maximale retournée par le lecteur XML. Ce quota ne limite pas la consommation de mémoire dans le lecteur XML lui-même, mais dans le composant qui utilise le lecteur. Par exemple, lorsque le DataContractSerializer utilise un lecteur sécurisé par MaxStringContentLength, il ne désérialise pas les chaînes de caractères supérieures à ce quota.

Importante

Pour plus d’informations sur la sécurisation de vos données, reportez-vous à « Utilisation de XML en toute sécurité » pour plus d’informations sur la sécurisation de vos données.

Remarque

Ces nouvelles valeurs par défaut sont utilisées uniquement si vous déployez le service WCF sur une machine avec .NET Framework 4.5. Si vous déployez le même service sur un ordinateur avec .NET Framework 4.0, les valeurs par défaut du .NET Framework 4.0 sont utilisées. Dans ce cas, il est recommandé de configurer ces paramètres explicitement.

Validation de la configuration WCF

Dans le cadre du processus de génération dans Visual Studio, les fichiers de configuration WCF sont désormais validés. Une liste d’erreurs de validation ou d’avertissements s’affiche dans Visual Studio si la validation échoue.

Info-bulles de l'éditeur XML

Pour aider les développeurs de services WCF nouveaux et existants à configurer leurs services, l’éditeur XML visual Studio fournit désormais des info-bulles pour chaque élément de configuration et ses propriétés qui font partie du fichier de configuration de service.

Améliorations de BasicHttpBinding

  1. Permet à un seul point de terminaison WCF de répondre à différents modes d’authentification.

  2. Permet de contrôler les paramètres de sécurité d’un service WCF par IIS