O seu browser não é suportado

Tem de atualizar o seu browser para utilizar o site.

Atualize para a versão mais recente do Internet Explorer

HTTP. SYS forçosamente desliga as ligações de HTTP para os serviços WCF alojados por conta própria

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 3137046
Sintomas
Um serviço do Windows Communication Foundation (WCF) por conta própria alojado num servidor que executa o Windows Server R2 de 2012 e que utilize ligações baseadas em HTTP, como obasicHttpBinding, o servidor ignora intermitentemente a ligação TCP subjacente. Quando este problema ocorre, pode vê-la no HTTP. Registos SYS que normalmente sejam encontram na pasta C:\WINDOWS\System32\LogFiles\HTTPERR. Os ficheiros de registo devem ter uma entrada que citesTimer_MinBytesPerSecondcomo o motivo. Este problema não ocorre no Windows Server 2008 R2.

A entrada de registo é semelhante ao seguinte:
#Fields: data hora c-ip c-porta s-ip cs-versão de s-port cs-method cs-uri sc-status s siteid s razão s-NomeFila
datatempo 10.145.136.58 41079 10.171.70.136 8888 HTTP/1.1 registar /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
datatempo 10.145.136.58 41106 10.171.70.136 8888 HTTP/1.1 registar /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
datatempo 10.145.136.58 40995 10.171.70.136 8888 HTTP/1.1 registar /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
datatempo 10.145.136.58 41022 10.171.70.136 8888 HTTP/1.1 registar /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
Em WCF traces, o serviço falha durante uma operação de bytes de recepção com System.Net.HttpListenerException, conforme o exemplo seguinte:
<Exception>
<ExceptionType>System.ServiceModel.CommunicationException. o, ServiceModel, versão = 4.0.0.0, idioma = neutro, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>Foi tentada uma operação numa ligação de rede não existente</Message>
<StackTrace>
em System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
em System.ServiceModel.Channels.HttpOutput.Close()
em System.ServiceModel.Channels.HttpRequestContext.OnReply (mensagem, TimeSpan tempo de espera)
em System.ServiceModel.Channels.RequestContextBase.Reply (mensagem, TimeSpan tempo de espera)
em System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (statusCode de HttpStatusCode, DescriçãoDoStatus de cadeia)
em System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (excepção ex contexto de HttpRequestContext)
</StackTrace>
<ExceptionString>System.ServiceModel.CommunicationException: Foi tentada uma operação numa rede não existe ligação---&gt; System.Net.HttpListenerException: foi tentada uma operação numa ligação de rede não existente
em System.Net.HttpResponseStream.Dispose (booleano escoamento)
em System.IO.Stream.Close()
em System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
---Fim do rastreamento da pilha de excepção interna--
em System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
em System.ServiceModel.Channels.HttpOutput.Close()
em System.ServiceModel.Channels.HttpRequestContext.OnReply (mensagem, TimeSpan tempo de espera)
em System.ServiceModel.Channels.RequestContextBase.Reply (mensagem, TimeSpan tempo de espera)
em System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (statusCode de HttpStatusCode, DescriçãoDoStatus de cadeia)
em System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (excepção ex contexto de HttpRequestContext)</ExceptionString>
<InnerException>
<Exception>
<ExceptionType>System.Net.HttpListenerException. o, sistema, versão = 4.0.0.0, idioma = neutro, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>Foi tentada uma operação numa ligação de rede não existente</Message>
<StackTrace>
em System.Net.HttpResponseStream.Dispose (booleano escoamento)
em System.IO.Stream.Close()
em System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
</StackTrace>
<ExceptionString>System.Net.HttpListenerException (0x80004005): Foi tentada uma operação numa ligação de rede não existente
em System.Net.HttpResponseStream.Dispose (booleano escoamento)
em System.IO.Stream.Close()
em System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()</ExceptionString>
<NativeErrorCode>4CD</NativeErrorCode>
</Exception>
</InnerException>
</Exception>
Causa
O controlador de kernel que processa pedidos HTTP (HTTP. sys) a partir do Windows Server R2 de 2012, foi alterado em como este processa a propriedadeTimer_MinBytesPerSecond. Por predefinição, o HTTP. sys considera qualquer taxa de velocidade de inferior a 150 bytes por segundo, como um potencial ataque de ligação de baixa velocidade e deixa cair a ligação de TCP para libertar o recurso. Este problema não ocorre no Windows Server 2008 R2 uma vez que o limiar de uma ligação lenta no Windows Server 2012 R2 é muito mais restrito.
Como contornar
Para contornar esta funcionalidade, defina a minSendBytesPerSecond como valor 0xFFFFFFFF (32 bits não assinado valor inteiro), que é 4,294,967,295 em decimal. Este valor específico desactiva a funcionalidade de ligação de taxa de velocidade inferior.

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

Método 1: Utilizar um ficheiro de configuração

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

Método 2: Definido programaticamente

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

System.Net.HttpListenerTimeoutManager.MinSendBytesPerSecond = 4294967295

A opção de programação pode ser transformada num serviceBehavior personalizado se uma alteração de código no serviço não é uma opção. Ou seja, um comportamento pode ser integrado com um serviço existente largando uma DLL e alterando a configuração, conforme o exemplo seguinte:
  1. Abra a solução no Visual Studio e adicionar um novo projecto de biblioteca de classes. O nome "BehaviorProject".
  2. Criar uma classe denominada "HttpListenerBehavior".
  3. Actualizá-lo com o seguinte código de origem:
    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. Compilar a aplicação de biblioteca.
  5. Copie a DLL gerada para a pasta de aplicação.
  6. Abra o ficheiro de configuração da aplicação, localize o <system.serviceModel>tag 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ção
Para determinar se as alterações tenham entrado em vigor, utilize um dos seguintes métodos.

Método 1

  1. Capture uma fileafter de informação de memória que é aberto o serviceHost.
  2. Copiar o objecto do tipo System.Net.HttpListenerTimeoutManagere ler a propriedademinSendBytesPerSecond .
0:000 >! DumpObj /d 02694a64
Nome: System.Net.HttpListenerTimeoutManager
MethodTable: 7308b070
EEClass: 72ec5238
Tamanho: 20(0x14) bytes
Ficheiro: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
Campos:
Nome do valor de ATR VT de tipo de contrapartida de MT campo
4 de 4001605 de 73092254... Serviço de escuta de 026932f0 de instância de Net.HttpListener 0
73c755d4 4001606 8 tempos de espera do System. Int32 [] 0 instância 02694a78
73c7ef20 4001607 c System.UInt32 1 instância 4294967295 minSendBytesPerSecond<>

Repare que o valor para minSendBytesPerSecond é 4294967295.

Método 2
  1. No modo de administrador, abra cmd.exe e execute o seguinte comando a partir de uma linha de comandos (depois de abrir serviceHost):

    netsh http Mostrar vista de servicestate = "sessão" > %temp%\netshOutput.txt
  2. Execute o seguinte comando para abrir o ficheiro netshOutput.txt. Será aberto no bloco de notas.

    Iniciar %temp%\netshOutput.txt
  3. Procure o número de porta de aplicação de serviço (por exemplo, 8888) e, em seguida, visualize a sessão. Este é o passo para verificar que a taxa mínima de envio (bytes/seg) está substituída com o valor 4294967295 .
  4. Deverá ver uma entrada semelhante à seguinte:

    ID de sessão do servidor: FE00000320000021
    Versão: 2.0
    Estado: activa
    Propriedades:
    Largura de banda máxima: 4294967295
    Tempos limite:
    Tempo limite do corpo de entidade (seg.): 120
    Esgotar o tempo limite do corpo de entidade (seg.): 120
    Pedir tempo limite (segs.) da fila: 120
    Inactivo tempo limite da ligação (segs.): 120
    Cabeçalho de espera (segs.): 120
    Velocidade mínima de envio (bytes/seg): 150
    Grupos de URLs:
    ID do grupo de URL: FD00000340000001
    Estado: activa
    Nome da fila de pedidos: pedir a fila não tem nome.
    Propriedades:
    Largura de banda máxima: herdadas
    Máximo de ligações: herdadas
    Tempos limite:
    Tempo limite do corpo de entidade (seg.): 0
    Esgotar o tempo limite do corpo de entidade (seg.): 0
    Pedir tempo limite (segs.) da fila: 0
    Inactivo tempo limite da ligação (segs.): 0
    Cabeçalho de espera (segs.): 0
    Velocidade mínima de envio (bytes/seg): 4294967295<>
    Número de URLs registados: 1
    URLs registados:
    HTTP://+:8888/TESTSERVICE1/
Para mais informações, consulte o Propriedade HttpListenerTimeoutManager.MinSendBytesPerSecond tópico no Web site da Microsoft Developer Network.
Nota Este é um artigo de “PUBLICAÇÃO RÁPIDA” criado directamente a partir da organização de suporte da Microsoft. As informações contidas neste artigo são fornecidas “tal como estão” em resposta a problemas recentes. Devido à urgência em disponibilizar este artigo, os materiais poderão incluir erros tipográficos e ser revistos em qualquer altura sem aviso prévio. Consulte os Termos de Utilização para outras considerações.

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 3137046 - Última Revisão: 03/07/2016 20:03:00 - Revisão: 2.0

  • Windows Communication Foundation 4.5
  • Windows Communication Foundation 4
  • kbmt KB3137046 KbMtpt
Esta informação foi útil?