2015-01-06 6 views
16

Ho fatto qualche semplice test di confronto e alcune informazioni che ho scoperto è statoHttpClient vs HttpWebRequest per migliorare le prestazioni e la sicurezza e meno connessioni

singolo HttpClient potrebbe essere condiviso da richiesta multipla, se condivisa e le richieste sono da la stessa destinazione, più richieste potrebbero riutilizzare le connessioni WebRequest necessità di ricreare la connessione per ogni richiesta.

Ho anche guardato un po 'di documentazione su altri modi di utilizzare HttpClient esempio

Il seguente articolo riassume la connessione NTLM autenticato ad alta velocità condivisione

HttpWebRequest.UnsafeAuthenticatedConnectionSharing

possibili implementazioni che ho provato sono mostrati sotto

A)

private WebRequestHandler GetWebRequestHandler() 
{ 
    CredentialCache credentialCache = new CredentialCache(); 
    credentialCache.Add(ResourceUriCanBeAnyUri, "NTLM", CredentialCache.DefaultNetworkCredentials); 
    WebRequestHandler handler = new WebRequestHandler 
    { 
     UnsafeAuthenticatedConnectionSharing = true, 
     Credentials = credentialCache 
    }; 

    return handler; 
} 

using (HttpClient client = new HttpClient(GetWebRequestHandler(), false)) 
{ 
} 

B)

using (HttpClient client = new HttpClient) 
    { 
    } 

C)

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("some uri string") 

Gradirei qualsiasi aiuto nel farmi capire quale approccio devo prendere in modo da ottenere le prestazioni max, riducendo al minimo le connessioni e fare in modo la sicurezza è non influenzato.

+0

HttpClient è il nuovo capretto freddo in città, ed è presumibilmente il migliore di tutti, supporti asincroni/compiti, ed è molto più portabile di altri (c'è anche WebClient). Tuttavia richiede .NET 4.5+. Detto questo, non penso che dovresti vedere molte differenze tra loro in termini di prestazioni non elaborate se usate correttamente. –

+1

Io uso HttpClient dare un'occhiata a questo post [STAI USANDO HTTPCLIENT ERRATO E STA DESTABILIZZANDO IL TUO SOFTWARE] (http://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/) –

+0

sicuramente vai con HttpClient, a prescindere dal fatto che gestisce il pool di connessioni, async/await out of the box, offre una maggiore flessibilità tramite gli Handler ed è anche più facile scrivere i test unitari con HttpClient. – Duy

risposta

7

Se si utilizza uno di essi con async, dovrebbe essere buono per il punto di vista delle prestazioni in quanto non bloccherà le risorse in attesa di risposta e otterrete un buon rendimento.

HttpClient è preferito su HttpWebRequest a causa di metodi asincroni disponibili fuori dalla scatola e non dovresti preoccuparti di scrivere i metodi di inizio/fine.

In pratica quando si utilizza la chiamata asincrona (utilizzando una delle due classi), non bloccherà le risorse in attesa della risposta e qualsiasi altra richiesta utilizzerà le risorse per effettuare ulteriori chiamate.

Un'altra cosa da tenere a mente che non si dovrebbe utilizzare HttpClient nel blocco "using" per consentire il riutilizzo delle stesse risorse ancora e ancora per altre richieste web.

Vedere questo thread per ulteriori informazioni

Do HttpClient and HttpClientHandler have to be disposed?

+0

Sì, ho appena imparato a smaltire HttpClient da solo. Sembra essere la grande discussione in questo momento. Per farla breve, non disporne! – trnelson

0
  1. C'è un problema nell'implementazione 'A'. La durata dell'istanza restituita da GetWebRequestHandler() è di breve durata (forse solo per l'esempio?). Se questo è stato fatto di proposito, annulla il passaggio di false per il secondo parametro del costruttore HttpClient. Il valore di false indica a HttpClient di non disporre del sottostante HttpMessageHandler (che aiuta con il ridimensionamento poiché non chiude la porta per la richiesta). Questo è, naturalmente, presupponendo che la durata dello HttpMessageHandler sia sufficientemente lunga per approfittare del vantaggio di non aprire/chiudere le porte (che ha un grande impatto sulla scalabilità del server). Quindi, ho una raccomandazione sotto l'opzione 'D'.

  2. C'è anche un'opzione 'D' che non si elenca sopra - per rendere l'istanza Httpclientstatic e riutilizzata in tutte le chiamate API. Questo è molto più efficiente dall'allocazione di memoria e dalla prospettiva di GC - così come l'apertura di porte sul client. Non hai il sovraccarico di allocare memoria e creare istanze HttpClient (e tutti gli oggetti sottostanti) e quindi evitare la pulizia tramite GC anche per loro.

prega di fare riferimento alla mia risposta fornita su una domanda simile - What is the overhead of creating a new HttpClient per call in a WebAPI client?

Problemi correlati