Por que o desempenho do objeto HttpWebRequest melhorar, enquanto usando o Fiddler?

StackOverflow https://stackoverflow.com/questions/1022844

  •  06-07-2019
  •  | 
  •  

Pergunta

Estou recebendo algumas comportamento muito estranho com HttpWebRequest espero que alguém me pode ajudar.Eu tenho um aplicativo de console que faz algumas agregação de trabalho, utilizando o objeto HttpWebRequest para recuperar o conteúdo de um site de destino.Devido à natureza do requisito, o aplicativo é multithreaded e tenta fazer em qualquer lugar entre 10 e 30 ligações simultâneas (eu tenho experimentado com um intervalo de valores).O real solicitação da web está estruturado da seguinte forma:

var req = (HttpWebRequest)WebRequest.Create(url);
WebResponse resp = req.GetResponse();
Stream s = resp.GetResponseStream();
var sr = new StreamReader(s, Encoding.ASCII);
string doc = sr.ReadToEnd();
sr.Close();
resp.Close();
return doc;

De qualquer maneira, o comportamento estranho é que, sob circunstâncias normais, o app está a atingir cerca de 120 pedidos por minuto, mas se eu abrir o Fiddler, ele salta para cerca de 600.Usando o Windows 7 Monitor de Recursos eu posso ver a rede de aumento de atividade de acordo.As conexões TCP para o processo de console agora lista o endereço remoto como "IPv4 loopback", em vez de destino endereço IP do servidor (o esperado).Eu fiz perguntam sobre o número máximo de simultâneas solicitações HTTP permitido pela máquina, mas mudar esta no registro não parecem fazer a diferença.

Assim, a pergunta é;o que é isso sobre a execução de um Violinista que, de repente, aumenta a taxa de transferência de cinco vezes e como posso conseguir isso nativamente na máquina sem a necessidade de lançar outra ferramenta?

Obrigado!

Foi útil?

Solução

Parece que agora consegui obter a taxa de transferência (para dobrar que eu estava recebendo com o Fiddler Open), definindo as conexões máximas no app.config:

<system.net>
  <connectionManagement>
    <add address="*" maxconnection="30" />
  </connectionManagement>
</system.net>

Muito feliz com o resultado, mas ainda estou um pouco confuso com o motivo pelo qual ter o Fiddler aberto mudou os resultados tão dramaticamente.

Outras dicas

Uma coisa que notei imediatamente é que você não está implementando usando blocos. Isso adiciona um fator de aleatoriedade que pode ser multiplicado pelo número de solicitações, por isso sugiro que você corrija isso:

var req = WebRequest.Create(url);
using (WebResponse resp = req.GetResponse())
{
    using (Stream s = resp.GetResponseStream())
    {
        using (var sr = new StreamReader(s, Encoding.ASCII))
        {
            return sr.ReadToEnd();
        }
    }
}

Em seguida, FYI, Fiddler atua como um proxy. Se o seu proxy padrão foi configurado para usar um script para configurar a configuração de proxy, então eu me pergunto se ter fiddler em execução pode não remover o tempo necessário para fazer a configuração do script. Isso pode acontecer apenas uma vez, e não em cada solicitação.

Eu tive um problema semelhante ao seu e queria compartilhar a minha resolução.

Em suma, eu tinha um programa de console que foi fazer solicitações HTTP e, depois de 15 minutos ou de modo, de tempo de espera.No entanto, se eu usei o Fiddler, em seguida, eu nunca experimentei tempos de espera, mesmo depois de tê-lo executado por dias seguidos.

Eu tentei definir o maxconnections propriedade em App.configuração, mas isso não parece ajudar em tudo.Então eu fui em e de cada uma referência para o HttpWebRequest, HttpWebResponse, e os objetos de fluxo utilizado para ler/escrever dados para esses objetos dentro de uso de blocos.

Que parece ter feito o truque.Fui correndo para quase 24 horas, agora sem um limite de tempo e sem o Fiddler execução.

A maneira como você consulta causa uma nova sessão para cada chamada, que é sobrecarga, pode ser que Fiddler acrescente sessão às suas consultas ....

tentar

Private Static CookieContainer _cookiecOntainer = new CookieContainer ();

_httpwebrequest.cookiecOntainer = _cookieContainer; // com a reciclagem do cookieContainer

Tivemos o mesmo problema, defina seu httpwebrequest.preeauthenticate como true.

Você não deve mais ter uma resposta 401, então abrirá menos conexões ...

Eu tive o mesmo problema. Eu baixei isto:http://www.wowinterface.com/downloads/info13581-leactrixlaticyfix.htmlFoi o motivo do desempenho da httpwebrequest. Ele modifica o TCPackFrequency e atrapalha totalmente tudo. Eu o removi e agora funciona.

Para mim, eu estava definindo request.ProtocolVersion = HttpVersion.Version10;

A configuração padrão para isso é httpversion.version11. Quando voltei isso ao padrão, meus pedidos foram muito mais rápidos sem violininho.

Espero que isso ajude outra pessoa, que me levou a manhã toda para descobrir isso!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top