2015-09-20 12 views
7

Ho un asp.net web ospitato su IIS 10 (Windows Server 2016). Quando faccio una richiesta GET a questo da un browser Microsoft Edge, vedo che HTTP 2.0 viene utilizzato in IIS registraCome rendere .net HttpClient utilizzare http 2.0?

2015-09-20 21:57:59 100.76.48.17 GET /RestController/Native - 443 - 73.181.195.76 HTTP/2.0 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/42.0.2311.135+Safari/537.36+Edge/12.10240 - 200 0 0 7299 

Tuttavia, quando una richiesta GET avviene tramite un .net 4.6 client come sotto,

using (var client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri("https://myapp.cloudapp.net/"); 

    HttpResponseMessage response = await client.GetAsync("RestController/Native"); 
    if (response.IsSuccessStatusCode) 
    { 
     await response.Content.CopyToAsync(new MemoryStream(buffer)); 
    } 
} 

vedo il HTTP 1.1 registro seguente nei log dei server

2015-09-20 20:57:41 100.76.48.17 GET /RestController/Native - 443 - 131.107.160.196 HTTP/1.1 - - 200 0 0 707 

Come posso fare il .net cl ient usa HTTP/2.0?

risposta

5

HttpClient non supporta ancora HTTP/2. Sarà disponibile nella prossima versione (nome in codice KATANA). Ecco lo link to their source code for the next release.

Fino ad allora, è possibile implementare il proprio HttpMessageHandler oggetto che implementa HTTP/2 e passarlo al costruttore 's il HttpClient (probabilmente si può utilizzare il loro codice sorgente da KATANA).

+0

Il repository a cui è collegato sembra essere solo per i componenti del server, non per il client (esiste un client di test, che utilizza TcpClient, ma non un vero HttpClient) –

+0

@RacilHilan Grazie per la risposta. "potresti implementare il tuo oggetto HttpMessageHandler che implementa HTTP/2" riguardo questo tuo commento. potresti approfondire di più? –

+0

@RashminJaviya Puoi copiare il codice dal loro codice sorgente usando il link nella mia risposta e aggiungerlo al tuo progetto. Ricorda che il codice proviene dallo sviluppo, quindi dovrai eseguire tutti i test e le eventuali correzioni da solo. Ovviamente, non è un compito semplice, ma era l'unica via di ritorno quando veniva posta questa domanda. Ora, le cose sono cambiate. Vedi la risposta di Oliver qui sotto se soddisfa le tue esigenze. –

2

HTTP/2 sembra che sarà supportato in C# client chiama con .NET 4.6.2

https://msdn.microsoft.com/en-us/library/ms171868(v=vs.110).aspx

HTTP/2 Supporto (Windows 10)

HTTP/2 è una nuova versione del protocollo HTTP che fornisce molto meglio l'utilizzo della connessione (meno round-trip tra client e server), che si traduce in un minore caricamento della pagina web per gli utenti. Le pagine Web (come opposte ai servizi) traggono il massimo vantaggio da HTTP/2, poiché il protocollo viene ottimizzato per la richiesta di più artefatti nell'ambito di una singola esperienza . Il supporto HTTP/2 è stato aggiunto a ASP.NET in .NET Framework 4.6. Poiché la funzionalità di rete esiste in più livelli , sono state richieste nuove funzionalità in Windows, in IIS e in ASP.NET per abilitare HTTP/2. È necessario essere in esecuzione su Windows 10 per utilizzare HTTP/2 con ASP.NET.

HTTP/2 è anche supportato e attivato per impostazione predefinita per Windows 10 Universal di Windows Platform (UWP) le applicazioni che utilizzano l'API System.Net.Http.HttpClient .

3

1.Accertarsi sei sulla versione ultima di di Windows 10.

2.Install WinHttpHandler:

Install-Package System.Net.Http.WinHttpHandler 

3.Extend WinHttpHandler per aggiungere http2.0 supporto:

public class Http2CustomHandler : WinHttpHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) 
    { 
     request.Version = new Version("2.0"); 
     return base.SendAsync(request, cancellationToken); 
    } 
} 

4.Passare sopra gestore per il costruttore HttpClient

using (var httpClient = new HttpClient(new Http2CustomHandler())) 
{ 
     // your custom code 
} 
+0

Funziona bene. – huyc

0

È possibile utilizzare System.Net.Http (versione 4.3.0 o superiore) per impostare HTTP/2 per HttpClient via Version proprietà di `HttpRequestMessage ':

yourHttpRequestMessage.Version = new Version(2, 0); 

Con questa la proprietà imposta il gestore interno di HttpClient tenterà di utilizzare HTTP/2 quando disponibile e di tornare a HTTP/1.1 quando non lo è.

Problemi correlati