HTTP. SYS trennt das HTTP-Bindungen für lokal gehosteten WCF-Dienste

Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 3137046
Problembeschreibung
Eine selbst gehostete Windows Communication Foundation (WCF)-Dienst auf einem Server, auf dem Windows Server 2012 R2 und HTTP-basierte Bindings (beispielsweiseBasicHttpBinding) verwendet, löscht der Server zeitweise die zugrunde liegende TCP-Verbindung. Wenn dieses Problem auftritt, sehen Sie es im HTTP. SYS-Protokolle, die normalerweise im Ordner C:\WINDOWS\System32\LogFiles\HTTPERR befinden. Die Protokolldateien müssen einen Eintrag, der Timer_MinBytesPerSecondals Grund gibt. Dieses Problem tritt nicht in Windows Server 2008 R2.

Der Protokolleintrag folgendermaßen aussehen:
#Fields: Datum Zeit c Ip-c-Port Ip-s s Cs-Anschlüssen Cs-Methode Cs-Uri sc-Status Siteid s s Grund s-queuename
DatumZeit 10.145.136.58 41079 10.171.70.136 8888 HTTP/1.1 POST /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
DatumZeit 10.145.136.58 41106 10.171.70.136 8888 HTTP/1.1 POST /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
DatumZeit 10.145.136.58 40995 10.171.70.136 8888 HTTP/1.1 POST /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
DatumZeit 10.145.136.58 41022 10.171.70.136 8888 HTTP/1.1 POST /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
In WCF Spuren kann der Dienst während eines Vorgangs Bytes empfangen mit System.Net.HttpListenerException, wie im folgenden Beispiel:
<Exception>
<ExceptionType>System.ServiceModel.CommunicationException, System.ServiceModel, Version = 4.0.0.0, Culture = Neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>Ein Vorgang bezog sich auf eine nicht vorhandene Netzwerk-Verbindung</Message>
<StackTrace>
am System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
am System.ServiceModel.Channels.HttpOutput.Close()
am System.ServiceModel.Channels.HttpRequestContext.OnReply (Nachricht, TimeSpan Timeout)
am System.ServiceModel.Channels.RequestContextBase.Reply (Nachricht, TimeSpan Timeout)
Bei System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode-StatusCode, Zeichenfolge StatusDescription)
Bei System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex HttpRequestContext Kontext)
</StackTrace>
<ExceptionString>System.ServiceModel.CommunicationException: Ein Vorgang bezog sich auf ein nicht vorhandenes Netzwerk Verbindung---&gt; System.Net.HttpListenerException: ein Vorgang bezog sich auf eine nicht vorhandene Netzwerk-Verbindung
Bei System.Net.HttpResponseStream.Dispose (Boolean disposing)
am System.IO.Stream.Close()
am System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
--Ende interne Ausnahme Stapelrahmen---
am System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
am System.ServiceModel.Channels.HttpOutput.Close()
am System.ServiceModel.Channels.HttpRequestContext.OnReply (Nachricht, TimeSpan Timeout)
am System.ServiceModel.Channels.RequestContextBase.Reply (Nachricht, TimeSpan Timeout)
Bei System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode-StatusCode, Zeichenfolge StatusDescription)
Bei System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex HttpRequestContext Kontext)</ExceptionString>
<InnerException>
<Exception>
<ExceptionType>System.Net.HttpListenerException, System, Version = 4.0.0.0, Culture = Neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>Ein Vorgang bezog sich auf eine nicht vorhandene Netzwerk-Verbindung</Message>
<StackTrace>
Bei System.Net.HttpResponseStream.Dispose (Boolean disposing)
am System.IO.Stream.Close()
am System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
</StackTrace>
<ExceptionString>System.Net.HttpListenerException (0 x 80004005): Auf einen nicht vorhandenen Netzwerkanschluss wurde ein Vorgang versucht
Bei System.Net.HttpResponseStream.Dispose (Boolean disposing)
am System.IO.Stream.Close()
am System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()</ExceptionString>
<NativeErrorCode>4-CD</NativeErrorCode>
</Exception>
</InnerException>
</Exception>
Ursache
Beginnend mit Windows Server 2012 R2 Kerneltreiber, der HTTP-Anfragen (http.sys) verarbeitet wurde im Hinblick auf die Behandlung derTimer_MinBytesPerSecond-Eigenschaft. Standardmäßig Http.sys berücksichtigt alle Geschwindigkeit von weniger als 150 Bytes pro Sekunde, während eine langsame Verbindung Angriffen und löscht die TCP-Verbindung, um die Ressourcen freizugeben. Dieses Problem tritt nicht in Windows Server 2008 R2 ist der Schwellenwert für langsame Verbindung in Windows Server 2012 R2 wesentlich restriktiver.
Abhilfe
Um dieses Feature zu umgehen, legen Sie MinSendBytesPerSecond auf Wert 0xFFFFFFFF (maximal 32-Bit ohne Vorzeichen Integer-Wert), ist die 4.294.967.295 Dezimal. Dieser bestimmte Wert deaktiviert die niedrigere Geschwindigkeit Rate Verbindung-Funktion.

Verwenden Sie eine der folgenden Methoden MinSendBytesPerSecond Wert 0xFFFFFFFFfestgelegt.

Methode 1: Verwenden einer Konfigurationsdatei

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

Methode 2: Programmgesteuert festlegen.

Ändern Sie die Eigenschaft explizit im Code wie im folgenden Beispiel:

System.Net.HttpListenerTimeoutManager.MinSendBytesPerSecond = 4294967295

Die Programmierung Option in benutzerdefinierten ServiceBehavior möglich ist eine codeänderung im Dienst nicht. D. h. ein Verhalten mit einem vorhandenen Dienst integrierbar DLL ablegen und Ändern der Konfiguration, wie im folgenden Beispiel:
  1. Öffnen Sie die Projektmappe in Visual Studio und fügen ein neues Class Library-Projekt. Nennen Sie sie "BehaviorProject."
  2. Erstellen Sie eine Klasse mit dem Namen "HttpListenerBehavior."
  3. Mit den folgenden Quellcode aktualisieren:
    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. Erstellen Sie Library-Anwendung.
  5. Kopieren Sie die generierte DLL Ordner Anwendung.
  6. Öffnen Sie die Anwendungskonfigurationsdatei, suchen Sie den <system.serviceModel>tag, und fügen Sie das folgende benutzerdefinierte Verhalten:</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>
Weitere Informationen
Um festzustellen, ob die Änderung gültig waren, verwenden Sie eine der folgenden Methoden.

Methode 1

  1. Erfassen Sie ein Speicher Dump Abschluss, die ServiceHost-Instanz geöffnet wird.
  2. Das Objekt des Typs System.Net.HttpListenerTimeoutManagerDump und Lesen Sie dieMinSendBytesPerSecond -Eigenschaft.
0:000 &gt;! DumpObj d 02694a64
Name: System.Net.HttpListenerTimeoutManager
MethodTable: 7308b070
EEClass: 72ec5238
Größe: 20(0x14) bytes
Datei: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
Felder:
MT Feld Offset Typ VT Attr Wertname
73092254 4001605 4... Net.HttpListener 0 Instanz 026932f0 Listener
73c755d4 4001606 8 Int32 [0] Instanz 02694a78 Timeouts
73c7ef20 4001607 c 1 UInt32 Instanz 4294967295 minSendBytesPerSecond<>

Beachten Sie, dass der Wert für MinSendBytesPerSecond 4294967295.

Methode 2
  1. Öffnen Sie im Administratormodus cmd.exe, und führen Sie den folgenden Befehl von einer Befehlszeile aus (nachdem der ServiceHost geöffnet ist):

    Netsh http anzeigen Servicestate = "Session" &gt; %temp%\netshOutput.txt
  2. Führen Sie den folgenden Befehl zum Öffnen der Datei netshOutput.txt. Im Editor wird geöffnet.

    %temp%\netshOutput.txt starten
  3. Der Dienst-Port-Nummer (z. B. 8888) suchen und die Sitzung anzeigen. Dies ist Schritt überprüfen, ob die minimale Übertragungsrate (Bytes/s) mit dem Wert 4294967295 überschrieben wird.
  4. Sehen Sie einen Eintrag, der dem folgenden ähnelt:

    Server-Session-ID: FE00000320000021
    Version: 2.0
    Status: aktiv
    Eigenschaften:
    Max. Bandbreite: 4294967295
    Zeitlimit:
    Zeitlimit (Sek.): 120
    Ausgleichentitätskörper-Zeitlimit (Sek.): 120
    Anforderungswarteschlangen-Zeitlimit (Sek.): 120
    Verbindung Leerlauftimeout (Sek.): 120
    Zeitlimit für Warten auf Header (Sek.): 120
    Minimale Übertragungsrate (Bytes/Sek.): 150
    URL-Gruppen:
    URL-Gruppen-ID: FD00000340000001
    Status: aktiv
    Warteschlangenname anzufordern: Request Queue ist unbenannt.
    Eigenschaften:
    Max. Bandbreite: vererbt
    Maximal: vererbt
    Zeitlimit:
    Zeitlimit (Sek.): 0
    Ausgleichentitätskörper-Zeitlimit (Sek.): 0
    Anforderungswarteschlangen-Zeitlimit (Sek.): 0
    Verbindung Leerlauftimeout (Sek.): 0
    Zeitlimit für Warten auf Header (Sek.): 0
    Minimale Übertragungsrate (Bytes/Sek.): 4294967295<>
    Anzahl von registrierten URLs: 1
    Registrierte URLs:
    HTTP://+:8888/TESTSERVICE1/
Weitere Informationen finden Sie unter der HttpListenerTimeoutManager.MinSendBytesPerSecond-Eigenschaft Thema auf der Microsoft Developer Network-Website.
Hinweis Dies ist ein Artikel, der im Schnellverfahren direkt von der Microsoft-Supportorganisation erstellt wurde. Die hierin enthaltenen Informationen werden als Reaktion auf neue Probleme wie besehen bereitgestellt. Da dieser Artikel im Schnellverfahren erstellt wurde, kann er Tippfehler enthalten und zu einem späteren Zeitpunkt ohne vorherige Ankündigung überarbeitet werden. Weitere zu berücksichtigende Informationen finden Sie in den Nutzungsbedingungen.

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 3137046 – Letzte Überarbeitung: 03/25/2016 01:20:00 – Revision: 3.0

Windows Communication Foundation 4.5, Windows Communication Foundation 4

  • kbmt KB3137046 KbMtde
Feedback