web-dev-qa-db-ja.com

System.Uriのスキームを変更する

特定の System.Uri インスタンスと System.UriBuilder のスキームを変更する標準的な方法を探しています。私が持っていると言う

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

それを 'https'に変更する必要があります。私の問題は、限られたUriBuilder ctorとUri.Portデフォルトは80です(443に変更する必要がありますか?ハードコーディングしますか?)。コードは、可能な基本認証資格情報、クエリ文字列など、すべてのUriプロパティを尊重する必要があります。

40
UserControl

これで終わった:

var uriBuilder = new UriBuilder(requestUrl)
{
    Scheme = Uri.UriSchemeHttps,
    Port = -1 // default port for scheme
};
86
UserControl

serControl's answer は、デフォルト以外のポートが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();
}
_

_uri.Uri.IsDefaultPort_before設定_uri.Scheme_を読み取る必要があることに注意してください。

以下に実際の例を示します。 https://dotnetfiddle.net/pDrF7s

29

カスタムのポートを使用する場合は、目的のhttpsポート番号をForceHttpsメソッドに渡すことをお勧めします。 httpとhttpsは同じサーバーで同じポートを使用することはできないため、URLに既にあるポートを実際に気にしません。

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/
2
TxRegex

おやすみオタクプライドの答えの拡張としての別の反復:

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;
}
2
Nick Evans