У меня есть сервер, который я перевожу с .NET 4.8 (ASP.NET + OWIN) на ASP.NET Core 8. По причинам мне приходится использовать HttpSys вместо Kestrel.
Единственное отличие, которое я заметил во время этой миграции, заключается в том, что по умолчанию ASP.NET Core включает HTTP/2 и использует его, тогда как версия .NET 4.8 всегда понижается до HTTP/1.1.
Проблема в том, что HTTP/2 запрещает повторное согласование, необходимое для получения сертификата клиента, который затем используется некоторыми конечными точками.
Есть ли способ заставить ASP.NET Core + HttpSys использовать HTTP/1.1? (например, отключить HTTP/2).
Из того, что я прочитал на https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/httpsys?view=aspnetcore-8.0
В будущих выпусках Windows будут доступны флаги конфигурации HTTP/2, включая возможность отключения HTTP/2 с помощью HTTP.sys.
И, к сожалению, этот день еще не наступил.
Итак, как .NET 4.8 уведомляет HttpSys о том, что он не поддерживает HTTP/2 (и, следовательно, переходит на HTTP/1.1)? Можно ли сделать то же самое с ASP.NET Core?
Мне нужно решение, которое применимо только к этому конкретному приложению, а не к изменениям конфигурации/реестра на уровне всего устройства, которые будут применяться глобально.
Я не думаю, что даже функции WINAPI предлагают это как опцию Learn.microsoft.com/en-us/windows/win32/api/http
@Charlieface Интересно, как тогда net48 AspNet заставляет http.sys отказаться от поддержки HTTP 2? Я знаю, что в будущем необходимо найти правильное решение для HTTP 2 и 3. Но на данный момент отказ от поддержки HTTP 2 будет самым простым способом сохранить то же поведение, что и приложение net48, которое работало до сих пор.
Я не уверен, но это зависит от вашей версии Windows и версии .NET. Каковы номера версий?
Windows 11, установлена платформа «4.8.09032». Но на самом деле net48 не поддерживает HTTP2 по соображениям совместимости независимо от версии.
Использует ли ASP.NET Classic HTTP.sys? Я не уверен, что это так. Я думаю, что он использует IIS.
Если вы не против отключить HTTP/2 для всех типичных приложений в этой Windows, вы можете применить несколько глобальных изменений, stackoverflow.com/questions/31668151/…
Если вы хотите изменить версию tls, чтобы отключить tls 1.2, я предлагаю вам попробовать изменить реестр, используя этот путь HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL.





Хитрость в том, что .NET Framework 4.8 поддерживает HTTP/2 (не обращая внимания на версию HTTP) и никогда явно не понижает версию HTTP в запросе.
Функция httpapi.dllHttpReceiveClientCertificate творит чудеса:
HTTP_1_1_REQUIRED (0xD).Чтобы добиться такого же поведения в .NET, вам нужно вызвать HttpReceiveClientCertificate напрямую (вам придется получить RequestQueueHandle и ConnectionId через Reflection) или вызвав внутреннюю функцию .NET (также через Reflection) — Microsoft.AspNetCore.Server.HttpSys.Request.GetClientCertificateAsync.
Вероятно, вам следует найти способ удалить повторное согласование, поскольку TLS1.3 и HTTP 2 и 3 — это путь вперед.