2015-09-20 283 views
7

我有一個asp.net Web API託管在IIS 10(Windows Server 2016)上。當我把從微軟邊緣瀏覽器GET要求這一點,我看到HTTP 2.0在IIS用於記錄如何使.net HttpClient使用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 

然而,當GET請求通過.net 4.6 client下面進行,

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

我看到下面的HTTP 1.1日誌服務器日誌

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 

我怎樣才能讓.NET CL客戶使用HTTP/2.0?

回答

5

HttpClient還不支持HTTP/2。它將在下一個版本中提供(代碼名稱KATANA)。這裏是link to their source code for the next release。直到那時,你可以實現你自己的實現HTTP/2的HttpMessageHandler對象,並將它傳遞給HttpClient的構造函數(你可以使用KATANA的源代碼)。

+0

您鏈接到的回購似乎只針對服務器組件,而不是客戶端(有一個測試客戶端,它使用TcpClient,但不是真正的HttpClient) –

+0

@RacilHilan謝謝你的回答。 「你可以實現你自己的實現HTTP/2的HttpMessageHandler對象」。你能詳細闡述一下嗎? –

+0

@RashminJaviya您可以使用我的答案中的鏈接從他們的源代碼複製代碼,並將其添加到您的項目中。請記住,代碼來自開發,所以你必須自己做所有的測試和可能的修復。顯然,這不是一項簡單的任務,但它是回答這個問題的唯一方式。現在,情況已經改變。如果符合您的需求,請參閱下面的Oliver的答案。 –

2

HTTP/2看起來將在C#客戶端能夠支持使用.NET調用4.6.2

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

HTTP/2支持(Windows 10)

HTTP/2是HTTP協議的新版本,它提供更好的連接利用率(客戶端和服務器之間的往返次數減少), 導致用戶的網頁加載延遲更低。網頁(與服務相對的 )最受益於HTTP/2,因爲協議 針對多個工件進行了優化,作爲單一的體驗的一部分。 HTTP/2支持已添加到ASP.NET中的.NET Framework 4.6中。由於網絡功能存在於多個層,所以在Windows中,IIS中以及ASP.NET 中都需要啓用HTTP/2的新功能。您必須在Windows 10上運行以使用HTTP/2和 ASP.NET。

HTTP/2被默認爲Windows 10通用 Windows平臺(UWP),其使用System.Net.Http.HttpClient API的應用也支持和上。

3

1.確保你在最新版本的Windows 10

2.安裝WinHttpHandler

Install-Package System.Net.Http.WinHttpHandler 

3.Extend WinHttpHandler添加http2.0支持:

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。通過以上處理的HttpClient的構造

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

這效果很好。 – huyc

0

您可以使用System.Net.Http(4.3.0或更高版本)通過的`HttpRequestMessage'Version屬性設置爲HTTP/2HttpClient

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

有了這個屬性設置HttpClient的內部處理程序將嘗試在可用時使用HTTP/2,如果不是,則回退到HTTP/1.1