2016-04-01 22 views
9

Ho avuto un problema di prestazioni basse con richieste HTTP su .NET. La richiesta HTTP GET a un'API REST sull'host locale ha richiesto circa 500 ms per essere completata. Ho passato molto tempo per sistemarlo. Ho provato molti modi: HttpClient, HttpWebRequest, WebClient e RestSharp. Nessuno di loro funziona. La maggior parte delle soluzioni su Internet ha detto di impostare il parametro su null ma non funzionerà più velocemente.C# Come impostare HttpClient Keep-Alive su false

L'unico modo che ho trovato per ridurre questa volta è quello di impostare il parametro Keep-Alive di richiesta di falso:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
request.Method = "GET"; 
request.KeepAlive = false; 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

Questa grande opera. Il tempo è ridotto a 7-10 ms. Ma ora per alcune ragioni ho bisogno di usare HttpClient invece di HttpWebRequest. E non riesco a trovare come impostare Keep-Alive su false per HttpClient. L'unica cosa che ho trovato è come impostarlo su true impostando un'intestazione "connection" su "Keep-Alive".

Sto usando questo codice per la richiesta POST da HttpClient:

 HttpClient _http = new HttpClient(); 
     _http.DefaultRequestHeaders.Accept.Clear(); 
     _http.DefaultRequestHeaders.Add("Connection", "Keep-Alive"); 
     _http.DefaultRequestHeaders.Add("Keep-Alive", "timeout=600"); 

     var content = new StringContent(
      request, Encoding.UTF8, "application/%appname%+xml"); 
     content.Headers.ContentType.Parameters.Add(
      new NameValueHeaderValue("type", "payload")); 

     HttpResponseMessage response = await _http.PostAsync(uri, content); 

e ci vogliono ancora circa 500-600 ms per completare.

+0

http://stackoverflow.com/questions/15211812/using-a-keep-alive-connection-in-winrts-httpclient-class ... solo un'idea ... –

+0

@AndreasNiedermair Grazie, questo è un primo link nel risultato di ricerca di Google. Ho già provato questo: content.Headers.Add ("Keep-Alive", "false"); Ma questo richiede anche più di 500 ms. – Vaskrol

risposta

1

See codice qui sotto:

HttpClient cli; 
... 
cli.DefaultRequestHeaders.Add("Connection", "keep-alive"); 
cli.DefaultRequestHeaders.Add("Keep-Alive", "600"); 
+0

Non funziona. Ho aggiornato una domanda con il mio codice. – Vaskrol

+0

L'esempio che hai postato che "funziona alla grande" è l'equivalente di KeepAlive = False. L'intestazione che hai provato è l'equivalente di KeepAlive = True. Stai facendo l'opposto di quello che devi fare. – Matt

16

Quando si imposta HttpWebRequest.KeepAlive = true il set di intestazione è Connection: keep-alive

Quando si imposta HttpWebRequest.KeepAlive = false il set di intestazione è Connection: close

Quindi avrete bisogno di

_http.DefaultRequestHeaders.Add("Connection", "close"); 
Problemi correlati