HTTP. SYS déconnecte de force les liaisons HTTP pour les services WCF auto-hébergé

IMPORTANT : Cet article est issu d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d’une traduction incorrecte du contenu ou de son utilisation par les clients.

La version anglaise de cet article est la suivante: 3137046
Symptômes
Dans un service Windows Communication Foundation (WCF) autonome hébergé sur un serveur qui exécute Windows Server 2012 R2 et qui utilise les liaisons (par exemple,basicHttpBinding) basé sur HTTP, le serveur intermittentes la connexion TCP sous-jacente. Lorsque ce problème se produit, vous pouvez le voir dans le protocole HTTP. Journaux SYS qui figurent généralement dans le dossier C:\WINDOWS\System32\LogFiles\HTTPERR. Les fichiers journaux doivent avoir une entrée qui cite Timer_MinBytesPerSecondle motif. Ce problème ne se produit pas dans Windows Server 2008 R2.

L'entrée de journal semblable à la suivante :
#Fields: date heure ip c c-port s-ip port s cs-version cs-méthode cs-uri sc-status siteid-s s-raison s-queuename
dateheure 10.145.136.58 41079 10.171.70.136 8888 HTTP/1.1 valider /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
dateheure 10.145.136.58 41106 10.171.70.136 8888 HTTP/1.1 valider /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
dateheure 10.145.136.58 40995 10.171.70.136 8888 HTTP/1.1 valider /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
dateheure 10.145.136.58 41022 10.171.70.136 8888 HTTP/1.1 valider /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
Dans les traces WCF, le service échoue pendant une opération d'octets recevoir avec System.Net.HttpListenerException, comme dans l'exemple suivant :
<Exception>
<ExceptionType>System.ServiceModel.CommunicationException, System.ServiceModel, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>Une opération a été tentée sur une connexion réseau inexistante</Message>
<StackTrace>
à System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
à System.ServiceModel.Channels.HttpOutput.Close()
à System.ServiceModel.Channels.HttpRequestContext.OnReply (du message, le délai d'expiration de TimeSpan)
à System.ServiceModel.Channels.RequestContextBase.Reply (du message, le délai d'expiration de TimeSpan)
à System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, statusDescription de chaîne)
à System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex HttpRequestContext contexte)
</StackTrace>
<ExceptionString>System.ServiceModel.CommunicationException : Une opération a été tentée sur un réseau qui n'existe pas de connexion---&gt; System.Net.HttpListenerException : une opération a été tentée sur une connexion réseau inexistante
au System.Net.HttpResponseStream.Dispose que (disposing Boolean)
à System.IO.Stream.Close()
à System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
---Fin de la trace de pile d'exception interne---
à System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
à System.ServiceModel.Channels.HttpOutput.Close()
à System.ServiceModel.Channels.HttpRequestContext.OnReply (du message, le délai d'expiration de TimeSpan)
à System.ServiceModel.Channels.RequestContextBase.Reply (du message, le délai d'expiration de TimeSpan)
à System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, statusDescription de chaîne)
à System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex HttpRequestContext contexte)</ExceptionString>
<InnerException>
<Exception>
<ExceptionType>System.Net.HttpListenerException, System, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>Une opération a été tentée sur une connexion réseau inexistante</Message>
<StackTrace>
au System.Net.HttpResponseStream.Dispose que (disposing Boolean)
à System.IO.Stream.Close()
à System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
</StackTrace>
<ExceptionString>System.Net.HttpListenerException (0 x 80004005): Une opération a été tentée sur une connexion réseau inexistante
au System.Net.HttpResponseStream.Dispose que (disposing Boolean)
à System.IO.Stream.Close()
à System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()</ExceptionString>
<NativeErrorCode>4CD</NativeErrorCode>
</Exception>
</InnerException>
</Exception>
Cause
À partir de Windows Server 2012 R2, le pilote de noyau qui gère les requêtes HTTP (http.sys) a été modifié en fonction de la façon dont il gère la propriétéTimer_MinBytesPerSecond. Par défaut, Http.sys considère que n'importe quel taux de vitesse inférieures à 150 octets par seconde qu'une attaque potentielle de la connexion à basse vitesse, et il supprime la connexion TCP pour libérer la ressource. Ce problème ne se produit pas dans Windows Server 2008 R2, parce que le seuil d'une connexion lente dans Windows Server 2012 R2 est beaucoup plus restrictive.
Contournement
Pour contourner cette fonctionnalité, définissez le minSendBytesPerSecond à la valeur 0xFFFFFFFF (valeur entière non signée des maximale de 32 bits), qui est de 4 294 967 295 en décimal. Cette valeur spécifique désactive la fonctionnalité de connexion taux vitesse inférieure.

Utilisez une des méthodes suivantes pour définir la minSendBytesPerSecond à la valeur 0xFFFFFFFF.

Méthode 1: Utiliser un fichier de configuration

 <system.net>    <settings>       <httpListener>           <timeouts minSendBytesPerSecond="4294967295" />       </httpListener>    </settings> </system.net>

Méthode 2: Définir par programme

Modifiez la propriété explicitement dans le code, comme dans l'exemple suivant :

System.Net.HttpListenerTimeoutManager.MinSendBytesPerSecond = 4294967295

L'option de programmation peut être transformée en un serviceBehavior personnalisé si un changement de code dans le service n'est pas une option. Autrement dit, un comportement peut être intégré avec un service existant par une DLL de la suppression et la modification de la configuration, comme dans l'exemple suivant :
  1. Ouvrez votre solution dans Visual Studio et ajoutez un nouveau projet de bibliothèque de classes. Le nom « BehaviorProject ».
  2. Créez une classe nommée « HttpListenerBehavior ».
  3. Mettre à jour avec le code source suivant :
    namespace BehaviorProject{    public class HttpListenerBehavior : BehaviorExtensionElement, IServiceBehavior    {        public override Type BehaviorType        {            get { return this.GetType(); }        }        protected override object CreateBehavior()        {            return new HttpListenerBehavior();        }        public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)        {            return;        }        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)        {                        UpdateSystemNetConfiguration();        }        private void UpdateSystemNetConfiguration()        {            ConfigurationProperty minSendBytesPerSecond;            minSendBytesPerSecond = new ConfigurationProperty("minSendBytesPerSecond",                typeof(long), (long)uint.MaxValue, null, null, ConfigurationPropertyOptions.None);            ConfigurationPropertyCollection properties;            HttpListenerTimeoutsElement timeOuts = new HttpListenerTimeoutsElement();            properties = GetMember(timeOuts, "properties") as ConfigurationPropertyCollection;            if (properties != null)            {                properties.Remove("minSendBytesPerSecond");                SetMember(timeOuts, "minSendBytesPerSecond", minSendBytesPerSecond);                properties.Add(minSendBytesPerSecond);            }        }        public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)        {            return;        }        public static object GetMember(object Source, string Field)        {            string[] fields = Field.Split('.');            object curr = Source;            BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;            bool succeeded = false;            foreach (string field in fields)            {                Type t = curr.GetType();                succeeded = false;                FieldInfo fInfo = t.GetField(field, bindingFlags);                if (fInfo != null)                {                    curr = fInfo.GetValue(curr);                    succeeded = true;                    continue;                }                PropertyInfo pInfo = t.GetProperty(field, bindingFlags);                if (pInfo != null)                {                    curr = pInfo.GetValue(curr, null);                    succeeded = true;                    continue;                }                throw new System.IndexOutOfRangeException();            }            if (succeeded) return curr;            throw new System.ArgumentNullException();        }        public static void SetMember(object Source, string Field, object Value)        {            string[] fields = Field.Split('.');            object curr = Source;            BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public;            bool succeeded = false;            int i = 0;            foreach (string field in fields)            {                i++;                Type t = curr.GetType();                succeeded = false;                FieldInfo fInfo = t.GetField(field, bindingFlags);                if (fInfo != null)                {                    if (i == fields.Length)                        fInfo.SetValue(curr, Value);                    curr = fInfo.GetValue(curr);                    succeeded = true;                    continue;                }                PropertyInfo pInfo = t.GetProperty(field, bindingFlags);                if (pInfo != null)                {                    if (i == fields.Length)                        fInfo.SetValue(curr, Value);                    curr = pInfo.GetValue(curr, null);                    succeeded = true;                    continue;                }                throw new System.IndexOutOfRangeException();            }            if (succeeded) return;            throw new System.ArgumentNullException();        }    }}

  4. Générez l'application de la bibliothèque.
  5. Copiez la DLL générée dans votre dossier d'application.
  6. Ouvrez le fichier de configuration d'application, recherchez la <system.serviceModel>de la balise et ajouter le comportement personnalisé suivant :</system.serviceModel>
    <extensions> <behaviorExtensions> <add name="httpListenerBehavior" type="BehaviorProject.HttpListenerBehavior, BehaviorProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> </behaviorExtensions></extensions><behaviors> <serviceBehaviors> <!-- if the serviceBehavior used by the service is named, add to the appropriate named behavior --> <behavior name="customBehavior"> <!-- The behavior is referenced by the following in line. Visual Studio will mark this line with a red underline because it is not in the config schema. It can be ignored. Notice that the other behaviors (like serviceMetadata) does not need to be added if they are not currently present --> <httpListenerBehavior /> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors></behaviors>
Plus d'informations
Pour déterminer si les modifications ont été efficaces, utilisez une des méthodes suivantes.

Méthode 1

  1. Capturer une fois de vidage de mémoire qu'ouverture de serviceHost.
  2. Dump de l'objet de type System.Net.HttpListenerTimeoutManageret lire la propriétéminSendBytesPerSecond .
0:000 > ! DumpObj /d 02694a64
Nom : System.Net.HttpListenerTimeoutManager
MethodTable : 7308b070
EEClass : 72ec5238
Taille : 20(0x14) octets
Fichier : C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
Champs :
Nom de la valeur de Attr Type VT de contrepartie MT champ
73092254 4001605 4... écouteur de 026932f0 de Net.HttpListener 0 instance
73c755d4 4001606 8 des délais d'expiration de System.Int32 [] 0 instance 02694a78
minSendBytesPerSecond de 73c7ef20 4001607 c System.UInt32 1 instance 4294967295<>

Notez que la valeur de minSendBytesPerSecond est 4294967295.

Méthode 2
  1. En mode administrateur, ouvrez cmd.exe et exécutez la commande suivante à partir d'une invite de commande (après l'ouverture de serviceHost) :

    netsh http afficher par servicestate = « session » > %temp%\netshOutput.txt
  2. Exécutez la commande suivante pour ouvrir le fichier netshOutput.txt. Il s'ouvre dans le bloc-notes.

    Démarrer %temp%\netshOutput.txt
  3. Rechercher le numéro de port de service application (par exemple, 8888) et affichez votre session. Il s'agit de l'étape pour vérifier que la vitesse de transmission minimale (octets/s) est remplacée par la valeur 4294967295 .
  4. Vous devriez voir une entrée semblable à la suivante :

    ID de session serveur : FE00000320000021
    Version : 2.0
    État : actif
    Propriétés :
    Bande passante maximale : 4294967295
    Délais d'attente :
    Délai de corps d'entité (secondes): 120
    Décharger le délai de corps d'entité (secondes): 120
    Délai d'attente de la file d'attente (en secondes) de la demande : 120
    Délai de connexion (en secondes) d'inactivité : 120
    Attente de l'en-tête (secondes): 120
    Vitesse de transmission minimale (octets/s): 150
    Groupes d'URL :
    ID de groupe d'URL : FD00000340000001
    État : actif
    Nom de la file d'attente de la demande : demande de file d'attente est sans nom.
    Propriétés :
    Bande passante maximale : héritée
    Nombre maximal de connexions : hérité
    Délais d'attente :
    Délai de corps d'entité (secondes): 0
    Décharger le délai de corps d'entité (secondes): 0
    Délai d'attente de la file d'attente (en secondes) de la demande: 0
    Délai de connexion (en secondes) d'inactivité: 0
    Attente de l'en-tête (secondes): 0
    Vitesse de transmission minimale (octets/s): 4294967295<>
    Nombre d'URL inscrites: 1
    URL inscrites :
    HTTP://+:8888/TESTSERVICE1/
Pour plus d'informations, consultez la Propriété de HttpListenerTimeoutManager.MinSendBytesPerSecond rubrique sur le site Web de Microsoft Developer Network.
Remarque Il s'agit d'un article de « PUBLICATION RAPIDE » rédigé directement au sein du service de support technique Microsoft. Les informations qui y sont contenues sont fournies en l'état, en réponse à des problèmes émergents. En raison du délai rapide de mise à disposition, les informations peuvent contenir des erreurs typographiques et, à tout moment et sans préavis, faire l'objet de révisions. Pour d'autres considérations, consultez les Conditions d'utilisation.

Propriétés

ID d'article : 3137046 - Dernière mise à jour : 03/25/2016 01:19:00 - Révision : 3.0

Windows Communication Foundation 4.5, Windows Communication Foundation 4

  • kbmt KB3137046 KbMtfr
Commentaires