2013-07-31 9 views
29

Ich bin auf der Suche nach der kanonischen Art, das Schema einer gegebenen System.Uri Instanz mit System.UriBuilder ohne schrullige Stringmanipulationen und magische Konstanten zu ändern. Sagen, ich habeÄndern des Schemas von System.Uri

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

und ich brauche es zu ändern 'https'. Mein Problem ist in begrenzt UriBuilder ctors und Uri.Port standardmäßig auf 80 (sollten wir es ändern, um 443? Hardcoding?). Der Code muss alle Uri Eigenschaften respektieren wie möglich grundlegende auth Anmeldeinformationen, Query-String usw.

Antwort

71

mit diesem ein bis zu Ende:

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

Als Hinweis - aus irgendeinem Grund, die Regelung Namensfelder sind nicht für PCL-Projekte (siehe [hier] (https://msdn.microsoft.com/en- us/library/system.uri.urischemehttps% 28v = vs.110% 29.aspx # Anker_2)). – dadude999

+2

Nur der Vollständigkeit halber: Dies wird nicht funktionieren für URIs mit nicht-Standard-Ports (z. B. "http: // localhost: 12345/Hallo" wird geändert in "https: // localhost/Hallo"). –

17

UserControl's answer funktioniert gut, wenn Sie sicher nicht-Standard-Ports machen sind in der URI erhalten.

Zum Beispiel sollte http://localhost:12345/hellohttps://localhost:12345/hello statt https://localhost/hello werden.

Hier ist, wie das leicht zu tun:

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

Bitte beachten, dass wir uri.Uri.IsDefaultPort lesen müssen voruri.Scheme Einstellung. Hier

ist ein funktionierendes Beispiel: https://dotnetfiddle.net/pDrF7s

Verwandte Themen