2015-09-20 7 views
7

У меня есть app.net web api, размещенный на IIS 10 (сервер Windows 2016). Когда я делаю GET запрос на это из браузера Microsoft Edge, я вижу, что 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 сл Использование HTTP/2.0?

ответ

5

HttpClient не поддерживает HTTP/2. Он будет доступен в следующем выпуске (кодовое имя KATANA). Вот link to their source code for the next release.

До этого момента вы могли бы реализовать свой собственный объект HttpMessageHandler, который реализует HTTP/2 и передает его на конструктор HttpClient (вы, вероятно, можете использовать их исходный код из KATANA).

+0

Репо, с которым вы связаны, похоже, только для серверных компонентов, а не для клиента (существует тестовый клиент, который использует TcpClient, но не настоящий HttpClient) –

+0

@RacilHilan Спасибо за ответ. «вы можете реализовать свой собственный объект HttpMessageHandler, который реализует HTTP/2» в отношении вашего комментария. не могли бы вы подробнее рассказать? –

+0

@RashminJaviya Вы можете скопировать код из исходного кода, используя ссылку в моем ответе и добавить его в свой проект. Помните, что код от разработки, поэтому вам придется делать все тестирование и возможные исправления самостоятельно. Очевидно, что это непростая задача, но это был единственный путь назад, когда этот вопрос был задан. Теперь все изменилось. См. Ниже ответ Оливера, если он соответствует вашим потребностям. –

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 Universal Приложения для платформы Windows (UWP), которые используют API System.Net.HttpClassHttpClient .

3

1.Убедитесь вы на версии Windows 10 в последнее.

2.Install 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 или выше), чтобы установить HTTP/2 для HttpClient через Version свойство `HttpRequestMessage ':

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

С этим свойство set Внутренний обработчик HttpClient будет пытаться использовать HTTP/2, если он доступен, и вернуться к HTTP/1.1, если это не так.

 Смежные вопросы

  • Нет связанных вопросов^_^