Changer le schéma du système.URI

je cherche une façon canonique de changer le schéma d'une donnée Système.Uri exemple Système.UriBuilder sans les manipulations de cordes merdiques et les constantes magiques. Dire que j'ai

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

et j'ai besoin de changer en"https'. Ma question est limitée UriBuilder cteurs et Uri.Port défaut de paiement à 80 (devrait-on le changer à 443? coder en dur?). Le code doit respecter tout Uri les propriétés telles que les identifiants d'authentification de base possibles, la requête chaîne de caractères, etc.

32
demandé sur UserControl 2013-07-31 14:54:56

3 réponses

Fini avec celui-ci:

var uriBuilder = new UriBuilder(requestUrl)
{
    Scheme = Uri.UriSchemeHttps,
    Port = -1 // default port for scheme
};
76
répondu UserControl 2013-07-31 11:26:29

réponse de UserControl fonctionne bien sauf si vous devez vous assurer que les ports non-default sont préservés dans L'URI.

Par exemple, http://localhost:12345/hello devrait devenir https://localhost:12345/hello au lieu de https://localhost/hello.

Voici comment faire:

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();
}

notez que nous devons lire uri.Uri.IsDefaultPortavanturi.Scheme.

Voici un exemple: https://dotnetfiddle.net/pDrF7s

20
répondu Good Night Nerd Pride 2017-05-23 12:34:26

je préfère passer le numéro de port https désiré dans la méthode ForceHttps si vous voulez utiliser un port personnalisé, sinon omettez le port https ou utilisez -1 pour utiliser le port standard (implicitement). Je ne me soucie pas vraiment du port qui est déjà sur l'url car http et https ne peuvent jamais utiliser le même port sur le même serveur.

dans le cas où l'url est déjà https, elle passera par le port inchangé, en laissant le port où il se trouve. lieu.

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;
}

Utilisation:

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/
1
répondu TxRegex 2018-07-11 17:28:02