52

我正在寻找使用System.UriBuilder更改给定System.Uri实例方案的规范方法,而无需进行糟糕的字符串操作和魔术常量。说我有

var uri = new Uri("http://localhost/hello")

我需要将其更改为“ https ”。我的问题在于有限的UriBuilderctors并且Uri.Port默认为80(我们应该将其更改为443吗?硬编码?)。代码必须尊重所有Uri属性,例如可能的基本身份验证凭据、查询字符串等。

4

4 回答 4

104

结束了这个:

var uriBuilder = new UriBuilder(requestUrl)
{
    Scheme = Uri.UriSchemeHttps,
    Port = -1 // default port for scheme
};
于 2013-07-31T11:26:29.637 回答
36

除非您必须确保在 URI 中保留非默认端口,否则UserControl 的答案工作正常。

例如,http://localhost:12345/hello应该成为https://localhost:12345/hello而不是https://localhost/hello.

以下是如何轻松做到这一点:

public static string ForceHttps(string requestUrl)
{
    var uri = new UriBuilder(requestUrl);

    var hadDefaultPort = uri.Uri.IsDefaultPort;
    uri.Scheme = Uri.UriSchemeHttps;
    uri.Port = hadDefaultPort ? -1 : uri.Port;

    return uri.ToString();
}

请注意,我们必须在设置uri.Uri.IsDefaultPort 之前uri.Scheme阅读。

这是一个工作示例:https ://dotnetfiddle.net/pDrF7s

于 2016-06-15T17:16:50.207 回答
7

晚安书呆子骄傲的答案的另一个迭代,作为扩展:

public static Uri RewriteHttps(this Uri originalUri)
{
    return new UriBuilder(originalUri)
    {
        Scheme = Uri.UriSchemeHttps,
        Port = originalUri.IsDefaultPort ? -1 : originalUri.Port // -1 => default port for scheme
    }.Uri;
}
于 2018-12-22T11:53:35.560 回答
3

如果您想使用自定义端口号,我更喜欢将所需的 https 端口号传递给 ForceHttps 方法,否则省略 https 端口或使用 -1 来使用标准端口号(隐式)。我真的不关心 url 上已经存在的端口,因为 http 和 https 永远不能在同一台服务器上使用相同的端口。

如果 url 已经是 https,它将保持不变,保留任何端口。

private static string ForceHttps(string requestUrl, int? httpsPort = null)
{
    var uri = new UriBuilder(requestUrl);
    // Handle https: let the httpsPort value override existing port if specified
    if (uri.Uri.Scheme.Equals(Uri.UriSchemeHttps)) {
        if (httpsPort.HasValue)
            uri.Port = httpsPort.Value;
        return uri.Uri.AbsoluteUri;
    }

    // Handle http: override the scheme and use either the specified https port or the default https port
    uri.Scheme = Uri.UriSchemeHttps;
    uri.Port = httpsPort.HasValue ? httpsPort.Value : -1;

    return uri.Uri.AbsoluteUri;
}

用法:

ForceHttps("http://www.google.com/"); // https://www.google.com/
ForceHttps("http://www.google.com/", 225); // https://www.google.com:225/
ForceHttps("http://www.google.com/", 443); // https://www.google.com:443/
ForceHttps("https://www.google.com/"); // https://www.google.com/
ForceHttps("https://www.google.com:443/"); // https://www.google.com:443/
ForceHttps("https://www.google.com:443/", -1); // https://www.google.com/
ForceHttps("http://www.google.com:80/"); // https://www.google.com/
ForceHttps("http://www.google.com:3000/", 8080); // https://www.google.com:8080/
于 2018-07-11T15:44:21.257 回答