2012-05-03 8 views
16

Ho scritto un programma multithread in C# che esegue la scansione di un sito Web, ma quando ho avviato Fiddler nella richiesta in background completata 12 volte più veloce, è davvero strano per me e quando chiudo i tassi di download di Fiddler rallenta. com'è possibile, per favore aiutatemi, (non ci sono impostazioni proxy per la mia connessione a ineternet e anche a Fiddler) Se potessi iniettare le prestazioni di Fiddler nella mia applicazione sarebbe meraviglioso, qualsiasi soluzione? C'è qualche magia dietro le quinte? :)Perché la richiesta Http con Fiddler è velocissima

Grazie

risposta

11

Puoi mostrare qualche codice di esempio in modo che le persone possano confermarlo? Altrimenti diventerà una supposizione selvaggia.

La mia ipotesi migliore: Fiddler uses keepalive che salverà il problema di aprire la connessione più e più volte. Puoi confermare ciò disabilitando sia Reuse client connections e Reuse connections to servers: se è lento come al solito (o più lento), si ottiene il vantaggio dal mantenere la connessione attiva.

+0

Nel mio programma quando creo una connessione e scarico il contenuto, chiuderò la risposta e interromperò la richiesta in finale, ma mi chiedo che questo sia lo stesso codice che è in esecuzione con il violinista in background e il suo veloce. il Fiddler cambia la mia richiesta e usa la stessa connessione per ogni richiesta? – Ehsan

+0

@Eshan _ "Fiddler modifica la mia richiesta e usa la stessa connessione per ogni richiesta?" _ Sì. – CodeCaster

+1

quindi, come posso utilizzare questa funzione nel mio programma con HttpWebRequest? – Ehsan

22

Il motivo è il limite per la quantità di connessioni http che viene ignorata quando si utilizza Fiddler.

Ho riscontrato lo stesso comportamento durante l'utilizzo di System.Net.Http.HttpClient per eseguire più richieste simultanee (~ 80). Con Fiddler in esecuzione, tutte le richieste si stavano completando molto più velocemente. Keep-alive è stato sicuramente abilitato.

Ho usato Wireshark per vedere cosa sta succedendo e per prima cosa ho notato che la modalità del traffico http era diversa. Con le richieste di Fiddler sono state lanciate tutte in una volta e dopo che le risposte sono seguite bene anche in gruppo. Senza Fiddler le richieste erano intercalate da risposte.

In secondo luogo, tcpview ha mostrato che il mio codice senza Fiddler ha creato solo 2 connessioni TCP sul server. Con Fiddler avviato, il numero di connessioni è aumentato drasticamente. Ce n'erano decine dalla mia app a Fiddler e poi da Fiddler al server.

È noto che lo standard http raccomanda che il numero di connessioni http non sia superiore a 2 e che il limite sia implementato come impostazione predefinita nei client http.

Nelle applicazioni .NET è possibile controllare il limite con la proprietà statica ServicePointManager.DefaultConnectionLimit. Come esperimento, avendolo impostato su 100, le richieste eseguivano la stessa velocità con o senza Fiddler.

L'impostazione può anche essere controllato attraverso app.config:

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

Ora, perché è il limite di connessione predefinita non rispettato durante l'utilizzo di Fiddler? Risulta che il limite è diverso quando un client http utilizza un proxy e Fiddler agisce come un proxy. Non ho trovato molte informazioni sul limite di connessione proxy oltre a this old article.