改变System.Uri的方案

Use*_*rol 42 .net c# url uri

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

var uri = new Uri("http://localhost/hello")
Run Code Online (Sandbox Code Playgroud)

我需要将其更改为" https ".我的问题是在有限的UriBuilderctors和Uri.Port默认为80(我们应该将它改为443?硬编码?).代码必须遵守所有Uri属性,例如可能的基本身份验证凭据,查询字符串等.

Use*_*rol 89

结束这一个:

var uriBuilder = new UriBuilder(requestUrl)
{
    Scheme = Uri.UriSchemeHttps,
    Port = -1 // default port for scheme
};
Run Code Online (Sandbox Code Playgroud)

  • 只是为了完整性:这不会与非默认端口的URI的工作(如通过`http://本地主机:12345/hello`将改为`的https://本地主机/ hello`). (3认同)
  • 请注意-由于某些原因,方案名称字段不适用于PCL项目(​​请参阅[此处](https://msdn.microsoft.com/zh-cn/library/system.uri.urischemehttps%28v=vs。 110%29.aspx#Anchor_2)。 (2认同)

Goo*_*ide 32

UserControl的答案很好,除非您必须确保在URI中保留非默认端口.

例如,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();
}
Run Code Online (Sandbox Code Playgroud)

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

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


Nic*_*ans 6

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

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;
}
Run Code Online (Sandbox Code Playgroud)