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.
3 réponses
Fini avec celui-ci:
var uriBuilder = new UriBuilder(requestUrl)
{
Scheme = Uri.UriSchemeHttps,
Port = -1 // default port for scheme
};
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.IsDefaultPort
avanturi.Scheme
.
Voici un exemple: https://dotnetfiddle.net/pDrF7s
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/