HTTP. SYS viene forzatamente disconnesso binding HTTP per i servizi WCF indipendente

IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l’obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 3137046
Sintomi
In un servizio Windows Communication Foundation (WCF) indipendente su un server che esegue Windows Server 2012 R2 e che utilizza le associazioni basate su HTTP (ad esempiobasicHttpBinding), in modo discontinuo interrompere la connessione TCP sottostante. Quando si verifica questo problema, è possibile vederlo in HTTP. Registri SYS che in genere si trovano nella cartella C:\WINDOWS\System32\LogFiles\HTTPERR. I file di registro dovrebbero avere una voce che segnala Timer_MinBytesPerSecondcome motivo. Questo problema si verifica in Windows Server 2008 R2.

La voce di registro simile al seguente:
#Fields: data ora c-ip c-porta s-ip porta s versione cs cs-metodo cs-uri sc-status siteid s s-motivo s-queuename
Dataora 10.145.136.58 41079 10.171.70.136 HTTP/1.1 8888 registrare /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
Dataora 10.145.136.58 41106 10.171.70.136 HTTP/1.1 8888 registrare /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
Dataora 10.145.136.58 40995 10.171.70.136 HTTP/1.1 8888 registrare /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
Dataora 10.145.136.58 41022 10.171.70.136 HTTP/1.1 8888 registrare /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
Nelle tracce WCF, il servizio non riesce durante un'operazione di ricezione byte con System.Net.HttpListenerException, come illustrato di seguito:
<Exception>
<ExceptionType>System.ServiceModel.CommunicationException, finestra di System. ServiceModel, versione = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>È stata tentata un'operazione su una connessione di rete inesistente</Message>
<StackTrace>
in System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
in System.ServiceModel.Channels.HttpOutput.Close()
in System.ServiceModel.Channels.HttpRequestContext.OnReply (messaggio, timeout TimeSpan)
in System.ServiceModel.Channels.RequestContextBase.Reply (messaggio, timeout TimeSpan)
in System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, statusDescription stringa)
in System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex, il contesto di HttpRequestContext)
</StackTrace>
<ExceptionString>System.ServiceModel.CommunicationException: È stata tentata un'operazione su una rete inesistente connessione---&gt; System.Net.HttpListenerException: è stata tentata un'operazione su una connessione di rete inesistente
in System.Net.HttpResponseStream.Dispose (Boolean disposing)
in System.IO.Stream.Close()
in System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
---Fine dell'analisi dello stack dell'eccezione interna--
in System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
in System.ServiceModel.Channels.HttpOutput.Close()
in System.ServiceModel.Channels.HttpRequestContext.OnReply (messaggio, timeout TimeSpan)
in System.ServiceModel.Channels.RequestContextBase.Reply (messaggio, timeout TimeSpan)
in System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, statusDescription stringa)
in System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex, il contesto di HttpRequestContext)</ExceptionString>
<InnerException>
<Exception>
<ExceptionType>System.Net.HttpListenerException, finestra di sistema, versione = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>È stata tentata un'operazione su una connessione di rete inesistente</Message>
<StackTrace>
in System.Net.HttpResponseStream.Dispose (Boolean disposing)
in System.IO.Stream.Close()
in System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
</StackTrace>
<ExceptionString>System.Net.HttpListenerException (0x80004005): È stata tentata un'operazione su una connessione di rete inesistente
in System.Net.HttpResponseStream.Dispose (Boolean disposing)
in System.IO.Stream.Close()
in System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()</ExceptionString>
<NativeErrorCode>4CD</NativeErrorCode>
</Exception>
</InnerException>
</Exception>
Cause
A partire da Windows Server 2012 R2, il driver del kernel che gestisce le richieste HTTP (http. sys) è stato modificato per quanto riguarda la modalità di gestione della proprietàTimer_MinBytesPerSecond. Per impostazione predefinita, HTTP. sys considera qualsiasi frequenza velocità meno di 150 byte al secondo come un potenziale attacco di connessione bassa velocità, e la connessione TCP per rilasciare la risorsa. Questo problema non si verifica in Windows Server 2008 R2 in quanto la soglia per una connessione lenta in Windows Server 2012 R2 è molto più restrittiva.
Workaround
Per aggirare questa funzionalità, impostare minSendBytesPerSecond il valore 0xFFFFFFFF (32-bit massimo valore integer senza segno), che è 4.294.967.295 in formato decimale. Questo valore specifico disattiva la funzionalità di connessione frequenza velocità inferiore.

Utilizzare uno dei seguenti metodi per impostare il minSendBytesPerSecond per il valore 0xFFFFFFFF.

Metodo 1: Utilizzare un file di configurazione

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

Metodo 2: Impostare a livello di codice

Modificare la proprietà in modo esplicito nel codice, come illustrato di seguito:

System.Net.HttpListenerTimeoutManager.MinSendBytesPerSecond = 4294967295

Se una modifica al codice del servizio non è un'opzione, è possibile effettuare l'opzione di programmazione in un serviceBehavior personalizzato. Vale a dire un comportamento può essere integrato con un servizio esistente eliminando una DLL e la modifica della configurazione, come illustrato di seguito:
  1. Aprire la soluzione in Visual Studio e aggiungere un nuovo progetto libreria di classi. Il nome "BehaviorProject".
  2. Creare una classe denominata "HttpListenerBehavior".
  3. Aggiorna con il codice sorgente riportato di seguito:
    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. Compilare l'applicazione libreria.
  5. Copiare la DLL generata nella cartella dell'applicazione.
  6. Aprire il file di configurazione dell'applicazione, individuare il <system.serviceModel>tag e aggiungere il seguente comportamento personalizzato:</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>
Informazioni
Per determinare se le modifiche sono state efficaci, utilizzare uno dei metodi descritti di seguito.

Metodo 1

  1. Acquisire un fileafter di dump di memoria che viene aperto serviceHost.
  2. Scarica l'oggetto di tipo System.Net.HttpListenerTimeoutManagere leggere la proprietàminSendBytesPerSecond .
0:000 >! DumpObj /d 02694a64
Nome: System.Net.HttpListenerTimeoutManager
MethodTable: 7308b070
EEClass: 72ec5238
Dimensione: 20(0x14) byte
File: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
Campi:
Offset di campo MT tipo VT Attr valore nome
4... di 73092254 4001605 listener 026932f0 istanza di Net.HttpListener 0
73c755d4 4001606 8 timeout 02694a78 istanza di System. Int32 [] 0
73c7ef20 4001607 c 1 UInt32 istanza 4294967295 minSendBytesPerSecond<>

Si noti che il valore di minSendBytesPerSecond 4294967295.

Metodo 2
  1. In modalità amministratore, aprire cmd.exe ed eseguire il comando seguente dal prompt dei comandi (dopo l'apertura di serviceHost):

    netsh http Mostra visualizzazione servicestate = "session" > %temp%\netshOutput.txt
  2. Eseguire il comando seguente per aprire il file netshOutput.txt. Verrà aperto nel blocco note.

    Start %temp%\netshOutput.txt
  3. Cercare il numero di porta del servizio dell'applicazione (ad esempio 8888) e quindi visualizzare la sessione. Questo è il passaggio per verificare che la velocità minima di trasmissione (byte/sec) viene sottoposto a override con il valore di 4294967295 .
  4. Verrà visualizzata una voce simile al seguente:

    ID di sessione server: FE00000320000021
    Versione: 2.0
    Stato: attivo
    Proprietà:
    Larghezza di banda massima: 4294967295
    Timeout:
    Timeout corpo entità (sec): 120
    Timeout svuotamento corpo entità (sec): 120
    Timeout della coda (sec) richiesta: 120
    Idle timeout connessione (sec): 120
    Timeout di attesa intestazioni (sec): 120
    Velocità minima di trasmissione (byte/sec): 150
    Gruppi di URL:
    ID gruppo di URL: FD00000340000001
    Stato: attivo
    Nome coda di richieste: coda di richieste senza nome.
    Proprietà:
    Larghezza di banda massima: ereditata
    Numero massimo di connessioni: ereditato
    Timeout:
    Timeout corpo entità (sec): 0
    Timeout svuotamento corpo entità (sec): 0
    Timeout della coda (sec) richiesta: 0
    Idle timeout connessione (sec): 0
    Timeout di attesa intestazioni (sec): 0
    Velocità minima di trasmissione (byte/sec): 4294967295<>
    Numero di URL registrati: 1
    URL registrati:
    HTTP://+:8888/TESTSERVICE1/
Per ulteriori informazioni, vedere la Proprietà HttpListenerTimeoutManager.MinSendBytesPerSecond argomento sul sito Web Microsoft Developer Network.
Nota: questo è un articolo a "PUBBLICAZIONE RAPIDA", creato direttamente all'interno dell'organizzazione di supporto Microsoft. Le informazioni contenute nel presente documento vengono fornite "così come sono" in risposta alle problematiche riscontrate. A causa della rapidità con cui vengono resi disponibili, i materiali possono contenere errori di battitura e sono soggetti a modifica senza preavviso, in qualsiasi momento. Per altre considerazioni, vedere le Condizioni per l'utilizzo.

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 3137046 - Ultima revisione: 03/25/2016 01:17:00 - Revisione: 3.0

Windows Communication Foundation 4.5, Windows Communication Foundation 4

  • kbmt KB3137046 KbMtit
Feedback