【问题标题】:Why isn't Request.Url.Scheme returning HTTPS?为什么 Request.Url.Scheme 不返回 HTTPS?
【发布时间】:2014-10-29 08:18:08
【问题描述】:

我在本地服务器上工作,我需要一个特定的 URL 来通过 HTTPS 访问,而其余的则通过 HTTP。我已将 Visual Studio 配置为使用 IIS Express,因此我可以使用 HTTP/SSL。

我有这样的方法:

[RequireHttps]
public ActionResult SomeHttpsMethod()
{
     //Do something
}

在另一个地方我有:

var url = Url.Action("SomeHttpsMethod", "SomeHttpsController", new { someParams }, Request.Url.Scheme);

如果我使用HTTPhttp://localhost:httpport 访问我的网站,我仍然会从Request.Url.Scheme 而不是HTTPS 返回HTTP。这就是它的工作方式吗?

显然,如果我使用HTTPS 访问我的网站,即以https://localhost:sslport 开头,则返回HTTPS(这是我想要的),但我不想访问HTTPS 中的网站, 仅适用于特定的 URL/控制器方法。

【问题讨论】:

  • 这是因为Request.Url.Scheme获取的是当前请求的方案, http。

标签: c# asp.net-mvc ssl https


【解决方案1】:

这一行:

var url = Url.Action("SomeHttpsMethod", "SomeHttpsController", 
    new { someParams }, Request.Url.Scheme);

根据您的 当前 请求的方案(即 HTTP)构造一个 URL。 Request 总是指当前请求。

你最好在这个地方硬编码“https”,因为你总是希望它是安全的:

var url = Url.Action("SomeHttpsMethod", "SomeHttpsController", 
    new { someParams }, "https");

【讨论】:

  • 好的,这样就返回了正确的协议。港口会发生什么?它返回给我一个我无法连接的网址https://localhost/somehttpsmethod,因为它必须是https://localhost:44300/somehttpsmethod
  • 这是 IIS Express 崩溃的地方。您最好切换到更强大并使用标准端口(80 和 443)的 IIS。
  • 我明白了。那么上面的代码可以在具有有效 SSL 证书的 IIS 上正常工作吗?
  • 甚至是用于本地测试的无效自签名证书。它仅对您的本地 PC 无效,这没什么大不了的 - 公众没有使用它。您只需点击浏览器警告就无法验证它。
  • @Haney 只要您以管理员身份运行 IIS-Express / VS,您就可以使用端口 80 和 443,或者,您可以使用命令行的东西在端口 443 上启用 SSL 以与 IIS 一起使用-快递。
【解决方案2】:

就我而言,这是因为在 ARR 服务器上设置错误的规则。如果您使用的是 HTTP 而不是 HTTPS,则需要查看一些内容。

【讨论】:

  • 什么是 ARR?高级首字母缩略词在解释问题和解决方案的网站上的答案非常无用。
  • ARR = 应用程序请求路由。它是一个 IIS 扩展,允许应用服务器充当负载平衡器。
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 2014-04-08
  • 2017-10-08
  • 2014-04-21
  • 1970-01-01
相关资源
最近更新 更多