C# UseHttpsRedirection是否工作不可靠?

C# UseHttpsRedirection是否工作不可靠?,c#,asp.net,asp.net-core,razor-pages,C#,Asp.net,Asp.net Core,Razor Pages,为我的ASP.NET Core Razor Pages应用程序创建的默认启动代码包括以下代码: app.UseHttpsRedirection(); 这似乎是偶然的。现在,在我的开发机器上,编辑地址栏中的URL,使其使用HTTP而不是HTTPS,这给了我一个连接重置错误 此外,我还找到了addRedirectToHttpPermanent()选项,该选项可以传递到app.UseRewriter() 此时,我不清楚为什么app.UseHttpsRedirection()似乎不起作用,或者我是否应

为我的ASP.NET Core Razor Pages应用程序创建的默认启动代码包括以下代码:

app.UseHttpsRedirection();
这似乎是偶然的。现在,在我的开发机器上,编辑地址栏中的URL,使其使用HTTP而不是HTTPS,这给了我一个连接重置错误

此外,我还找到了
addRedirectToHttpPermanent()
选项,该选项可以传递到
app.UseRewriter()

此时,我不清楚为什么
app.UseHttpsRedirection()
似乎不起作用,或者我是否应该使用
UseRewriter()

有人知道了吗?

TL;博士: 重定向按预期工作
HTTP
HTTPS
使用不同的端口

仅从url中删除
s
:https://localhost:44336,您正在尝试对需要
HTTPS
的应用程序端口执行
HTTP
,该端口不受支持。要使重定向生效,您需要使用
HTTP
HTTP
端口联系

使用指定的
HTTP
url,
http://localhost:53640
,您将看到应用程序按预期重定向

在我的示例中,请参见
launchSettings.json
它的定义如下:

"applicationUrl": "http://localhost:53640"

所以这里发生的事情如下:

一般来说
  • “HTTPS端口”*,只接受HTTPS(,因此不接受HTTP)连接
  • “HTTP端口”*,只接受HTTP(,因此不接受HTTPS)连接
*在物理世界中并没有HTTPS或HTTP端口,因为它是在上定义的

UseHttpsRedirection
将HTTP端口上的入站HTTP流量路由到HTTPS端口上的HTTPS流量

如果浏览器中的URL未指定端口号,则默认为协议通常使用的端口。HTTP为端口80,HTTPS为端口443

调试器案例 为了防止端口冲突,VisualStudio默认使用非标准端口进行调试。您可以在“launchSettings.json”文件中看到它们

我的看起来像这样:

 "iisSettings": {
    "windowsAuthentication": false, 
    "anonymousAuthentication": true, 
    "iisExpress": {
      "applicationUrl": "http://localhost:53640",
      "sslPort": 44336
    }
  },
注意2个端口号。重定向仅在指定端口(和到指定端口)工作

在53640接受HTTP,在44336接受HTTPS

您的用例 通过更改删除URL栏中的
s
,您正在更改:

https://localhost:44336

http://localhost:44336

注意,由于您没有调整端口,因此尝试在HTTPS端口上连接HTTP。此方案不在重定向范围内,将失败

仅<代码>http://localhost:53640将重定向到
https://localhost:44336
。只是HTTP:
http://localhost:44336
将导致连接重置

生产服务器案例 在正常情况下,您可以使用默认端口(80用于HTTP,443用于HTTPS,带有适当的证书)将应用程序发布到Web服务器

由于用户使用的浏览器也使用这些默认端口,因此重定向效果良好,因为:

将实际转换为和 将转化为

因此,这将神奇地实现:

将重定向到

浏览器只是不显示端口号。 要查找
launchSettings.json
文件:VS中的文件:


或者 如果这没有帮助,可能是
app.Use…
的顺序错误

基本上,它是注册中间件的扩展。订单很重要

通常,最初配置重定向,然后配置MVC。像这样:

app.UseHttpsRedirection(); 
app.UseMvc();
app.UseOtherMiddleWare();
如果您颠倒顺序,可能会在管道的前面遇到一个错误,并且重定向不会执行。

TL;博士: 重定向按预期工作
HTTP
HTTPS
使用不同的端口

仅从url中删除
s
:https://localhost:44336,您正在尝试对需要
HTTPS
的应用程序端口执行
HTTP
,该端口不受支持。要使重定向生效,您需要使用
HTTP
HTTP
端口联系

使用指定的
HTTP
url,
http://localhost:53640
,您将看到应用程序按预期重定向

在我的示例中,请参见
launchSettings.json
它的定义如下:

"applicationUrl": "http://localhost:53640"

所以这里发生的事情如下:

一般来说
  • “HTTPS端口”*,只接受HTTPS(,因此不接受HTTP)连接
  • “HTTP端口”*,只接受HTTP(,因此不接受HTTPS)连接
*在物理世界中并没有HTTPS或HTTP端口,因为它是在上定义的

UseHttpsRedirection
将HTTP端口上的入站HTTP流量路由到HTTPS端口上的HTTPS流量

如果浏览器中的URL未指定端口号,则默认为协议通常使用的端口。HTTP为端口80,HTTPS为端口443

调试器案例 为了防止端口冲突,VisualStudio默认使用非标准端口进行调试。您可以在“launchSettings.json”文件中看到它们

我的看起来像这样:

 "iisSettings": {
    "windowsAuthentication": false, 
    "anonymousAuthentication": true, 
    "iisExpress": {
      "applicationUrl": "http://localhost:53640",
      "sslPort": 44336
    }
  },
注意2个端口号。重定向仅在指定端口(和到指定端口)工作

在53640接受HTTP,在44336接受HTTPS

您的用例 通过更改删除URL栏中的
s
,您正在更改:

https://localhost:44336

http://localhost:44336

注意,由于您没有调整端口,因此尝试在HTTPS端口上连接HTTP。此方案不在重定向范围内,将失败

仅<代码>http://localhost:53640将重定向到
https://localhost:44336
。只是HTTP:
http://localhost:44336
将导致连接重置

生产服务器案例 在正常情况下,使用默认端口(80用于HTTP,443用于HTTPS,wi)将应用程序发布到Web服务器