HTTP. SYS se deconectează forțat HTTP legăturile pentru WCF auto hosted services

IMPORTANT: Acest articol este tradus cu ajutorul software-ului Microsoft de traducere automată și poate fi corectat prin intermediul tehnologiei Community Translation Framework (CTF). Microsoft oferă articole traduse automat, post-editate de comunitate și articole traduse de oameni, pentru a permite accesul la toate articolele din Baza noastră de cunoștințe în mai multe limbi. Articolele traduse automat și post-editate pot conține greșeli de vocabular, sintaxă și/sau gramatică. Microsoft nu este responsabil de inexactitățile, erorile sau daunele cauzate de traducerea greșită a conținutului sau de utilizarea acestuia de către clienți. Găsiți mai multe informații despre traducerea în colaborare la http://support.microsoft.com/gp/machine-translation-corrections/ro.

Faceți clic aici pentru a vizualiza versiunea în limba engleză a acestui articol: 3137046
Simptome
Un serviciu Windows Communication Foundation (WCF) auto-găzduită pe un server care execută Windows Server 2012 R2 și care utilizează legăturile de tip HTTP (cum ar fibasicHttpBinding), serverul intermitent scade bază conexiunea TCP. Când apare această problemă, puteți vedea în HTTP. SYS jurnalele care se găsește de obicei în folderul C:\WINDOWS\System32\LogFiles\HTTPERR. Fișierele jurnal ar trebui să aibă o intrare care citează Timer_MinBytesPerSecondca motivul. Această problemă se produce în Windows Server 2008 R2.

Intrarea de jurnal seamănă cu următorul:
#Fields: data de marcă de timp c-ip c-port s-ip s-port versiunea cs cs-metoda cs-uri sc stare s-siteid s-motiv s-queuename
datamarcă de timp 10.145.136.58 41079 10.171.70.136 8888 HTTP/1.1 PUBLICAȚI /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
datamarcă de timp 10.145.136.58 41106 10.171.70.136 8888 HTTP/1.1 PUBLICAȚI /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
datamarcă de timp 10.145.136.58 40995 10.171.70.136 8888 HTTP/1.1 PUBLICAȚI /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
datamarcă de timp 10.145.136.58 41022 10.171.70.136 8888 HTTP/1.1 PUBLICAȚI /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
În WCF urme, serviciul nu reușește în timpul unei operațiuni de octeți de primire cu System.Net.HttpListenerException, ca în exemplul următor:
<Exception>
<ExceptionType>System.ServiceModel.CommunicationException, System.ServiceModel, versiune = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>S-a încercat o operațiune pe o conexiune de rețea inexistente</Message>
<StackTrace>
la System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
la System.ServiceModel.Channels.HttpOutput.Close()
la System.ServiceModel.Channels.HttpRequestContext.OnReply (mesaj mesaj, TimeSpan timeout)
la System.ServiceModel.Channels.RequestContextBase.Reply (mesaj mesaj, TimeSpan timeout)
la System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, String statusDescription)
la System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (excepție ex, HttpRequestContext context)
</StackTrace>
<ExceptionString>System.ServiceModel.CommunicationException: S-a încercat o operațiune într-o rețea inexistente conexiune---&gt; System.Net.HttpListenerException: s-a încercat o operațiune pe o conexiune de rețea inexistente
la System.Net.HttpResponseStream.Dispose (eliminare Boolean)
la System.IO.Stream.Close()
la System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
---Sfârșitul inner exception stack trace---
la System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
la System.ServiceModel.Channels.HttpOutput.Close()
la System.ServiceModel.Channels.HttpRequestContext.OnReply (mesaj mesaj, TimeSpan timeout)
la System.ServiceModel.Channels.RequestContextBase.Reply (mesaj mesaj, TimeSpan timeout)
la System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, String statusDescription)
la System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (excepție ex, HttpRequestContext context)</ExceptionString>
<InnerException>
<Exception>
<ExceptionType>System.Net.HttpListenerException, sistem, versiune = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>S-a încercat o operațiune pe o conexiune de rețea inexistente</Message>
<StackTrace>
la System.Net.HttpResponseStream.Dispose (eliminare Boolean)
la System.IO.Stream.Close()
la System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
</StackTrace>
<ExceptionString>System.Net.HttpListenerException (0x80004005): S-a încercat o operațiune pe o conexiune de rețea inexistente
la System.Net.HttpResponseStream.Dispose (eliminare Boolean)
la System.IO.Stream.Close()
la System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()</ExceptionString>
<NativeErrorCode>4CD</NativeErrorCode>
</Exception>
</InnerException>
</Exception>
Cauză
Începând cu Windows Server 2012 R2, driverul de nucleu care gestionează solicitările HTTP (http.sys) a fost schimbat în ceea ce priveşte modul în care tratează proprietateaTimer_MinBytesPerSecond. implicit, Http.sys consideră orice rate de viteză de mai puțin de 150 bytes pe secundă ca o viteză redusă conexiune atac potenţial şi ea scade conexiunea TCP pentru a elibera resursa. Această problemă se produce în Windows Server 2008 R2 deoarece pragul pentru o conexiune lentă în Windows Server 2012 R2 este mult mai restrictivă.
Remediere
Pentru a rezolva această caracteristică, setați minSendBytesPerSecond la valoarea 0xFFFFFFFF (32-biți maximă nesemnate valoare întreagă), care este 4,294,967,295 în zecimal. Această valoare specifică dezactivează mai mică viteză rata conexiune caracteristica.

Utilizați una dintre următoarele metode pentru a seta minSendBytesPerSecond la valoarea 0xFFFFFFFF.

Metoda 1: Utilizează un fișier de configurare

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

Metoda 2: Setați programatic

Modifică proprietatea explicit în cod, ca în exemplul următor:

System.Net.HttpListenerTimeoutManager.MinSendBytesPerSecond = 4294967295

Opțiunea de programare pot fi făcute într-o serviceBehavior particularizată dacă o modificare de cod în serviciul nu este o opțiune. Adică, un comportament poate fi integrat cu serviciu existent fixând un DLL şi modificând configurația, ca în exemplul următor:
  1. Deschideți soluţia în Visual Studio și adăugați un nou proiect de biblioteci de clase. nume de sign-in "BehaviorProject."
  2. Creați un denumită "HttpListenerBehavior."
  3. O actualizare cu următorul cod sursă:
    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. Compilarea aplicației bibliotecă.
  5. Copiați folderul application generat DLL.
  6. Deschideți fișierul de configurare a aplicației, identificați <system.serviceModel>eticheta și adăugați următorul comportament particularizat:</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>
Informaţii suplimentare
Pentru a determina dacă modificările au fost eficiente, utilizați una dintre următoarele metode.

Metoda 1

  1. Capturați o fileafter de imagine memorie serviceHost este deschis.
  2. Dump obiectul de tip System.Net.HttpListenerTimeoutManagerși citiți proprietateaminSendBytesPerSecond .
0:000 >! DumpObj d 02694a64
Nume: System.Net.HttpListenerTimeoutManager
MethodTable: 7308b070
EEClass: 72ec5238
Dimensiune: 20(0x14) bytes
Fișier: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
Câmpuri:
Câmp MT Offset tip VT Attr Value Name
73092254 4001605 4... Net.HttpListener 0 instanța de ascultare 026932f0
73c755d4 4001606 8 System.Int32 [0] instanță 02694a78 timeout
73c7ef20 c 4001607 System.UInt32 1 instanță 4294967295 minSendBytesPerSecond<>

Observați că valoarea pentru minSendBytesPerSecond este 4294967295.

Metoda 2
  1. În modul de Administrator, deschideţi cmd.exe şi executaţi următoarea comandă la un prompt de comandă (după serviceHost este deschis):

    netsh http afișare vizualizare Proiect servicestate = "sesiune" > %temp%\netshOutput.txt
  2. Executaţi următoarea comandă pentru a deschide fișierul netshOutput.txt. Se va deschide în Notepad.

    Start %temp%\netshOutput.txt
  3. Căutați numărul de port application service (cum ar fi 8888) şi apoi să vizualizaţi sesiunea dvs. Acest pas pentru a verifica că rata de trimitere minime (bytes/sec) este înlocuită cu valoarea 4294967295 este.
  4. Ar trebui să vedeţi o intrare care seamănă cu următorul:

    Server sesiune ID: FE00000320000021
    Versiune: 2.0
    Stare: activ
    Proprietăți:
    Bandă Max: 4294967295
    Timeout:
    Entitate corp expirare (secunde): 120
    Se scurgă entitate corp expirare (secunde): 120
    Solicitare coadă de expirare (secunde): 120
    Inactiv marcă de timp de expirare conexiune (secunde): 120
    Antet de așteptare expirare (secunde): 120
    Rata de trimitere minime (bytes/sec): 150
    Grupuri de URL:
    ID grup de URL: FD00000340000001
    Stare: activ
    Solicitare nume coadă: solicitare coada este anonimă.
    Proprietăți:
    Bandă Max: moștenite
    Max conexiuni: moștenite
    Timeout:
    Entitate corp expirare (secunde): 0
    Se scurgă entitate corp expirare (secunde): 0
    Solicitare coadă de expirare (secunde): 0
    Inactiv marcă de timp de expirare conexiune (secunde): 0
    Antet de așteptare expirare (secunde): 0
    Rata de trimitere minime (bytes/sec): 4294967295<>
    Numărul de URL-uri înregistrat: 1
    URL-uri înregistrate:
    HTTP://+:8888/TESTSERVICE1/
Pentru mai multe informații, consultați Proprietatea HttpListenerTimeoutManager.MinSendBytesPerSecond subiect pe site web Reţea Microsoft pentru dezvoltatori.
Notă Acesta este un articol „FAST PUBLISH” creat direct în cadrul organizaţiei de asistenţă Microsoft. Informaţiile conţinute aici sunt furnizate ca atare, drept răspuns la problemele care apar. Din cauza rapidităţii cu care sunt puse la dispoziţie, materialele pot avea erori tipografice şi pot fi revizuite în orice moment, fără înştiinţare. Consultaţi Termeni de utilizare pentru alte considerente.

Avertisment: acest articol a fost tradus automat

Proprietăți

ID articol: 3137046 - Ultima examinare: 03/25/2016 01:14:00 - Revizie: 2.0

Windows Communication Foundation 4.5, Windows Communication Foundation 4

  • kbmt KB3137046 KbMtro
Feedback