2013-07-31 15 views
29

Sto cercando il modo canonico di modificare lo schema di una determinata istanza System.Uri con System.UriBuilder senza manipolazioni di stringhe e costanti magiche. Dire che hoModifica dello schema di System.Uri

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

e ho bisogno di cambiare a 'https'. Il mio problema è limitato ai sensori UriBuilder e Uri.Port predefinito a 80 (dovremmo cambiarlo in 443? Hardcoding?). Il codice deve rispettare tutte le Uri proprietà quali possibili credenziali di autenticazione di base, stringa di ricerca, ecc

risposta

71

finito con questo:

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

Come nota - per qualche ragione, i campi Nome regime non sono disponibili per i progetti PCL (vedi [qui] (https://msdn.microsoft.com/en- us/library/system.uri.urischemehttps% 28v = vs.110% 29.aspx # ANCHOR_2)). – dadude999

+2

Solo per completezza: non funzionerà per gli URI con porte non predefinite (ad esempio 'http: // localhost: 12345/hello' sarà cambiato in' https: // localhost/hello'). –

17

UserControl's answer funziona bene a meno che non si deve fare in modo porte non predefinite sono conservato nell'URI.

Ad esempio, http://localhost:12345/hello deve essere https://localhost:12345/hello anziché https://localhost/hello.

Ecco come fare facilmente:

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

noti che dobbiamo leggere uri.Uri.IsDefaultPortprima impostazione uri.Scheme.

Ecco un esempio di lavoro: https://dotnetfiddle.net/pDrF7s

Problemi correlati