#c# #asp.net #asp.net-core #razor-pages
#c# #asp.net #asp.net-core #страницы-бритвы
Вопрос:
Код запуска по умолчанию, созданный для моего ASP.NET Приложение Core Razor Pages включает в себя следующий код:
app.UseHttpsRedirection();
Похоже, это ошибка. Прямо сейчас, на моем компьютере для разработки, редактирование URL-адреса в адресной строке, чтобы он использовал HTTP вместо HTTPS, выдает ошибку «Соединение было сброшено«.
Кроме того, я нашел AddRedirectToHttpsPermanent()
параметр, который можно передать app.UseRewriter()
.
На данный момент мне неясно, почему app.UseHttpsRedirection()
не работает, или если я должен использовать UseRewriter()
.
Кто-нибудь понял это?
Комментарии:
1. вы видели эту статью о доверии к ASP.NET SSL-сертификат для разработки ядра? Еще одна вещь, которую нужно проверить, это запустить VS (или любую другую среду IDE, которую вы используете) в качестве администратора и посмотреть, получите ли вы то же самое
2. @GlynnHurrell: По умолчанию мой проект выполняется в HTTPS на моей машине разработки. Вот почему я попытался изменить его на HTTP, чтобы посмотреть, что произошло. Возможно, я не понимаю вашу точку зрения.
3. Нет, вы правы, я пропустил вашу точку зрения. Ого!
Ответ №1:
TL; DR:
Перенаправление работает так, как ожидалось. HTTP
и HTTPS
используйте разные порты.
Только удалив s
из URL: https://localhost:44336
, вы пытаетесь выполнить HTTP
для порта приложения, который ожидает HTTPS
, который не поддерживается. Чтобы перенаправление заработало, вам нужно связаться с HTTP
портом, используя HTTP
.
Используя указанный HTTP
URL http://localhost:53640
, вы увидите, что приложение перенаправляется, как и ожидалось.
В моем примере, см. launchSettings.json
это определено следующим образом:
"applicationUrl": "http://localhost:53640"
Итак, что здесь происходит, это следующее:
В общем
- «Порт HTTPS»* принимает только HTTPS (поэтому нет HTTP) соединений.
- «Порт HTTP»* принимает только HTTP (поэтому нет HTTPS) соединений.
* в физическом мире нет такого понятия, как порт HTTPS или HTTP, поскольку он определен на уровне 7 OSI.
UseHttpsRedirection
, маршрутизирует входящий HTTP-трафик на HTTP-порту в HTTPS-трафик на HTTPS-порту.
Когда URL-адрес в браузере не указывает номер порта, по умолчанию используется порт, обычно используемый протоколом. Это порт 80 для HTTP и 443 для HTTPS.
Случай с отладчиком
Чтобы предотвратить коллизии портов, Visual Studio по умолчанию использует нестандартные порты для отладки. Вы можете увидеть их в файле ‘launchSettings.json`.
Мой выглядит так:
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53640",
"sslPort": 44336
}
},
Обратите внимание на 2 номера портов. Перенаправление работает только на (и к) указанным портам.
HTTP принимается на 53640, HTTPS принимается на 44336.
Ваш вариант использования
Изменяя удаление s
в строке URL, вы меняете:
https://localhost:44336
Для
http://localhost:44336
Обратите внимание, поскольку вы не настроили порт, вы пытаетесь подключиться с помощью HTTP через порт HTTPS. Этот сценарий не покрывается перенаправлением и завершится неудачей.
Только http://localhost:53640
будет перенаправлять на https://localhost:44336
. Просто HTTP: http://localhost:44336
приведет к сбросу соединения.
Корпус производственного сервера
В обычных обстоятельствах вы отправляете свое приложение на веб-сервер, используя порты по умолчанию (80 для HTTP и 443 для HTTPS, с соответствующим сертификатом).
Поскольку браузер, который использует пользователь, также использует эти порты по умолчанию, перенаправление работает хорошо, поскольку:
http://example.org фактически переведет на http://example.org:80 и https://example.org переведет на https://example.org:443
и, таким образом, это волшебным образом сработает из коробки:
http://example.org:80 перенаправит на https://example.org:443
Браузер просто не показывает номера портов. Чтобы найти launchSettings.json
файл: файл в VS:
В качестве альтернативы
Если это не поможет, возможно, порядок app.Use...
неправильный.
В основном это расширения, регистрирующие промежуточное программное обеспечение. Порядок важен.
Обычно сначала настраивается перенаправление, а затем MVC. Вот так:
app.UseHttpsRedirection();
app.UseMvc();
app.UseOtherMiddleWare();
Если вы измените порядок, возможно, вы столкнетесь с ошибкой ранее в конвейере, и перенаправление не будет выполнено.
Комментарии:
1. Что ж, мастера Visual Studio решили, где
app.UseHttpsRedirection()
было размещено. Кроме того, я не используюapp.UseMvc()
в приложениях Razor Pages.