HTTP. SYS desconecta obrigatoriamente ligações HTTP para serviços de hospedagem interna do WCF

IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.

Clique aqui para ver a versão em Inglês deste artigo: 3137046
Sintomas
Em um serviço Windows Communication Foundation (WCF) hospedada automaticamente em um servidor que esteja executando o Windows Server 2012 R2 e que usa ligações baseado em HTTP (por exemplo, obasicHttpBinding), o servidor descarta intermitentemente a conexão TCP subjacente. Quando esse problema ocorre, você pode vê-lo em HTTP. Logs SYS são normalmente encontrados na pasta C:\WINDOWS\System32\LogFiles\HTTPERR. Os arquivos de log devem ter uma entrada que cita Timer_MinBytesPerSecondcomo o motivo. Esse problema não ocorre no Windows Server 2008 R2.

A entrada de log semelhante à seguinte:
#Fields: data hora c-ip c porta s-ip porta s cs-versão cs-method cs-uri sc status siteid s s motivo s-NomeDaFila
Data detempo 10.145.136.58 41079 10.171.70.136 HTTP/1.1 8888 lançar /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
Data detempo 10.145.136.58 41106 10.171.70.136 HTTP/1.1 8888 lançar /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
Data detempo 10.145.136.58 40995 10.171.70.136 HTTP/1.1 8888 lançar /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
Data detempo 10.145.136.58 41022 10.171.70.136 HTTP/1.1 8888 lançar /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
Nos rastreamentos WCF, o serviço falha durante uma operação de bytes de recepção com System.Net.HttpListenerException, como no exemplo a seguir:
<Exception>
<ExceptionType>System.ServiceModel.CommunicationException, System. ServiceModel, versão = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>Foi tentada uma operação em uma conexão de rede não existente</Message>
<StackTrace>
em System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
em System.ServiceModel.Channels.HttpOutput.Close()
no System.ServiceModel.Channels.HttpRequestContext.OnReply (mensagem, tempo limite TimeSpan)
no System.ServiceModel.Channels.RequestContextBase.Reply (mensagem, tempo limite TimeSpan)
no System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (statusCode HttpStatusCode, String statusDescription)
no System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex HttpRequestContext contexto)
</StackTrace>
<ExceptionString>System.ServiceModel.CommunicationException: Foi tentada uma operação em uma rede inexistente conexão---&gt; System.Net.HttpListenerException: foi tentada uma operação em uma conexão de rede não existente
no System.Net.HttpResponseStream.Dispose (Boolean disposing)
em System.IO.Stream.Close()
em System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
---Fim do rastreamento de pilha de exceção interna--
em System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
em System.ServiceModel.Channels.HttpOutput.Close()
no System.ServiceModel.Channels.HttpRequestContext.OnReply (mensagem, tempo limite TimeSpan)
no System.ServiceModel.Channels.RequestContextBase.Reply (mensagem, tempo limite TimeSpan)
no System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (statusCode HttpStatusCode, String statusDescription)
no System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex HttpRequestContext contexto)</ExceptionString>
<InnerException>
<Exception>
<ExceptionType>System.Net.HttpListenerException, sistema, versão = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>Foi tentada uma operação em uma conexão de rede não existente</Message>
<StackTrace>
no System.Net.HttpResponseStream.Dispose (Boolean disposing)
em System.IO.Stream.Close()
em System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
</StackTrace>
<ExceptionString>System.Net.HttpListenerException (0x80004005): Foi tentada uma operação em uma conexão de rede não existente
no System.Net.HttpResponseStream.Dispose (Boolean disposing)
em System.IO.Stream.Close()
em System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()</ExceptionString>
<NativeErrorCode>CD 4</NativeErrorCode>
</Exception>
</InnerException>
</Exception>
Causa
Iniciando com o Windows Server 2012 R2, o driver do kernel que lida com solicitações HTTP (http. sys) foi alterado em termos de como ele lida com a propriedadeTimer_MinBytesPerSecond. Por padrão, o HTTP. sys considera qualquer taxa de velocidade de menos de 150 bytes por segundo de um ataque de conexão de baixa velocidade e descarta a conexão TCP para liberar os recursos. Esse problema não ocorre no Windows Server 2008 R2 porque o limite de uma conexão lenta no Windows Server 2012 R2 é muito mais restritivo.
Como Contornar
Como solução alternativa para esse recurso, defina o minSendBytesPerSecond como valor 0xFFFFFFFF (máximo de 32 bits sem sinal valor inteiro), que é 4.294.967.295 em decimal. Este valor específico desabilita o recurso de conexão de taxa de velocidade mais baixo.

Use um dos seguintes métodos para definir o minSendBytesPerSecond como valor 0xFFFFFFFF.

Método 1: Usar um arquivo de configuração

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

Método 2: Definir através de programação

Altere a propriedade explicitamente no código, como no seguinte exemplo:

System.Net.HttpListenerTimeoutManager.MinSendBytesPerSecond = 4294967295

A opção de programação pode ser transformada em um serviceBehavior personalizado se uma alteração de código no serviço não é uma opção. Ou seja, um comportamento pode ser integrado a um serviço existente, soltando uma DLL e alterar a configuração, como no exemplo a seguir:
  1. Abra a solução no Visual Studio e adicione um novo projeto de biblioteca de classes. Nomeie-a como "BehaviorProject".
  2. Criar uma classe chamada "HttpListenerBehavior".
  3. Atualizá-lo com o seguinte código-fonte:
    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. Crie o aplicativo de biblioteca.
  5. Copie a DLL gerada para a pasta de aplicativo.
  6. Abra o arquivo de configuração do aplicativo, localize a <system.serviceModel>marcar e adicionar o seguinte comportamento personalizado:</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>
Mais Informações
Para determinar se as alterações foram efetuadas, use um dos seguintes métodos.

Método 1

  1. Capture um atualizaçãoarquivo de despejo de memória que o serviceHost é aberto.
  2. O objeto do tipo System.Net.HttpListenerTimeoutManagerde despejo e ler a propriedade deminSendBytesPerSecond .
0:000 >! DumpObj /d 02694a64
Nome: System.Net.HttpListenerTimeoutManager
MethodTable: 7308b070
EEClass: 72ec5238
Tamanho: 20(0x14) bytes
Arquivo: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
Campos:
MT campo deslocamento tipo VT Attr valor nome
4... do 73092254 4001605 Net.HttpListener 0 ouvinte de 026932f0 de instância
73c755d4 8 4001606 System. Int32 [] 0 instância 02694a78 tempos limite
73c7ef20 4001607 c System.UInt32 1 instância 4294967295 minSendBytesPerSecond<>

Observe que o valor de minSendBytesPerSecond é de 4294967295.

Método 2
  1. No modo de administrador, abra cmd.exe e execute o seguinte comando em um prompt de comando (após o serviceHost é aberto):

    Netsh http Mostrar modo de exibição do estado do serviço = "sessão" > %temp%\netshOutput.txt
  2. Execute o seguinte comando para abrir o arquivo netshOutput.txt. Ele será aberto no bloco de notas.

    Iniciar %temp%\netshOutput.txt
  3. Procure o número de porta do aplicativo de serviço (como 8888) e, em seguida, exibir a sessão. Esta é a etapa para verificar que a taxa mínima de envio (bytes/seg) seja substituída com o valor 4294967295 .
  4. Você deverá ver uma entrada semelhante à seguinte:

    Identificação de sessão de servidor: FE00000320000021
    Versão: 2.0
    Estado: ativa
    Propriedades:
    Largura de banda máxima: 4294967295
    Tempo limite:
    Tempo limite do corpo de entidade (s): 120
    Descarregar o tempo limite do corpo de entidade (s): 120
    Solicitar tempo limite da fila (s): 120
    Tempo ocioso (em segundos) de tempo limite de conexão: 120
    Tempo limite de espera de cabeçalho (s): 120
    Taxa mínima de envio (bytes/seg): 150
    Grupos de URL:
    ID do grupo de URL: FD00000340000001
    Estado: ativa
    Nome da fila de solicitações: fila de solicitação sem nome.
    Propriedades:
    Largura de banda máxima: herdada
    Máximo de conexões: herdadas
    Tempo limite:
    Tempo limite do corpo de entidade (s): 0
    Descarregar o tempo limite do corpo de entidade (s): 0
    Solicitar tempo limite da fila (s): 0
    Idle timeout da conexão (s): 0
    Tempo limite de espera de cabeçalho (s): 0
    Taxa mínima de envio (bytes/seg): 4294967295<>
    Número de URLs registrados: 1
    URLs registrados:
    HTTP://+:8888/TESTSERVICE1/
Para obter mais informações, consulte o Propriedade HttpListenerTimeoutManager.MinSendBytesPerSecond tópico no site da Microsoft Developer Network.
Observação: este é um artigo de “PUBLICAÇÃO RÁPIDA” criado diretamente pela organização de suporte da Microsoft. As informações aqui contidas são fornecidas no presente estado, em resposta a questões emergentes. Como resultado da velocidade de disponibilização, os materiais podem incluir erros tipográficos e poderão ser revisados a qualquer momento, sem aviso prévio. Consulte os Termos de Uso para ver outras informações.

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 3137046 - Última Revisão: 03/25/2016 01:15:00 - Revisão: 3.0

Windows Communication Foundation 4.5, Windows Communication Foundation 4

  • kbmt KB3137046 KbMtpt
Comentários