2015-09-20 4 views
7

Ich habe eine ASP.net Web API auf IIS 10 gehostet (Windows Server 2016). Wenn ich eine GET Anforderung an diesem von einem Microsoft Edge-Browser machen, sehe ich, dass HTTP 2.0 in IIS verwendet wird protokolliertWie man den .net HttpClient http 2,0 verwenden?

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 

Wenn jedoch eine GET Anfrage, wie unten durch ein .net 4.6 client gemacht wird,

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)); 
    } 
} 

ich sehe das folgende HTTP 1.1 Protokoll in den Serverprotokollen

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 

Wie kann ich die .net cl machen Verwenden Sie HTTP/2.0?

Antwort

5

HttpClient unterstützt HTTP/2 noch nicht. Es wird in der nächsten Version (Codename KATANA) verfügbar sein. Hier ist die link to their source code for the next release.

Bis dahin könnten Sie Ihr eigenes HttpMessageHandler Objekt implementieren, das HTTP/2 implementiert und es an den Konstruktor HttpClient übergibt (Sie können wahrscheinlich ihren Quellcode von KATANA verwenden).

+0

Das Repository, mit dem Sie verbunden sind, scheint nur für die Serverkomponenten zu sein, nicht für den Client (es gibt einen Testclient, der TcpClient verwendet, aber keinen echten HttpClient) –

+0

@RacilHilan Vielen Dank für Ihre Antwort. "Sie könnten Ihr eigenes HttpMessageHandler-Objekt implementieren, das HTTP/2" in Bezug auf Ihren Kommentar implementiert. Könntest du mehr ausarbeiten? –

+0

@RashminJaviya Sie können den Code aus dem Quellcode mithilfe des Links in meiner Antwort kopieren und zu Ihrem Projekt hinzufügen. Denken Sie daran, dass der Code aus der Entwicklung stammt. Daher müssen Sie alle Tests und möglichen Korrekturen selbst durchführen. Natürlich ist das keine einfache Aufgabe, aber es war der einzige Weg zurück, als diese Frage gestellt wurde. Jetzt haben sich die Dinge geändert. Siehe Oliver's Antwort unten, wenn es Ihren Bedürfnissen entspricht. –

2

HTTP/2 sieht aus wie wird es in C# Client unterstützt werden Anrufe mit .NET 4.6.2

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

HTTP/2-Unterstützung (Windows 10)

HTTP/2 ist eine neue Version des HTTP-Protokolls, die eine viel bessere Verbindungsauslastung bietet (weniger Round-Trips zwischen Client und Server), , was zu niedrigerer Latenz beim Laden von Webseiten für Benutzer führt. Webseiten (wie im Gegensatz zu Diensten) profitieren am meisten von HTTP/2, da das Protokoll optimiert für mehrere Artefakte, die als Teil einer einzigen Erfahrung angefordert werden. HTTP/2-Unterstützung wurde in .NET Framework 4.6 hinzugefügt. Da die Netzwerkfunktionalität in mehreren Schichten vorhanden ist, waren in Windows, in IIS und in ASP.NET neue Funktionen erforderlich, um HTTP/2 zu aktivieren. Sie müssen auf Windows 10 ausgeführt werden, um HTTP/2 mit ASP.NET zu verwenden.

HTTP/2 wird auch standardmäßig für Windows 10 Universal Windows-Plattform (UWP) -Apps unterstützt, die die System.Net.Http.HttpClient API verwenden.

3

1.Der Sie sind auf der neuesten Version von Windows-10.

2.Install WinHttpHandler:

Install-Package System.Net.Http.WinHttpHandler 

3.Extend WinHttpHandler hinzufügen http2.0 Unterstützung:

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.Übergeben Sie oben Handler zum Httpclient Konstruktor

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

Das funktioniert gut. – huyc

0

können Sie verwenden System.Net.Http (Version 4.3.0 oder höher) HTTP/2 für HttpClient über Version Eigenschaft `HttpRequestMessage 'zu setzen:

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

Mit diesem Eigenschaft gesetzt der interne Handler von HttpClient wird versuchen, HTTP/2 zu verwenden, wenn verfügbar, und fällt zurück auf HTTP/1.1, wenn es nicht ist.

Verwandte Themen