2009-11-25 5 views
5

Ho bisogno di combinare due URL che contengono entrambe le informazioni .Path.La parte del percorso viene sovrascritta quando si uniscono due URI

Vorrei usare Uri per darmi la possibilità di .TryCreate(), in modo da poter rilevare gli URL malformati.

Il problema che sto affrontando è che il percorso di base URI sembra essere ignorato quando ho fondere l'assoluto e il relativo URI:

Uri absoluteUri= new Uri("http://hostname/path/", UriKind.Absolute); 
Uri relativeUri = new Uri("/my subsite/my page.aspx?my=query", UriKind.Relative); 
Uri resultUri; 
if (!Uri.TryCreate(absoluteUri, relativeUri, out resultUri)) 
     // handle errors 

uscita di quanto sopra è:

http://hostname/my%20subsite/my%20page.aspx?my=query 

vorrei che fosse:

http://hostname/path/my%20subsite/my%20page.aspx?my=query 

c'è un modo per combinare gli URL che Bo Contiene le informazioni sul percorso utilizzando la classe Uri?

risposta

12

vostro URI relativo deve essere relativo, cioè, rimuovere prima barra (o aggiungere un periodo),

string relative = "/my subsite/my page.aspx?my=query"; 

Uri test1= new Uri(relative.Substring(1), UriKind.Relative); // without 'root' 
Uri test2= new Uri("." + relative, UriKind.Relative);  // with 'current' 

esempio di lavoro:

Uri baseUri = new Uri("http://hostname/path/"); 
string relative = "/my subsite/my page.aspx?my=query"; 

Uri test1 = new Uri(baseUri, relative);    // original string 
Uri test2 = new Uri(baseUri, relative.Substring(1)); // without 'root' character 
Uri test3 = new Uri(baseUri, "." + relative);  // with 'current' character 

Console.WriteLine(test1.OriginalString); // wrong 
Console.WriteLine(test2.OriginalString); // right! 
Console.WriteLine(test3.OriginalString); // right! 

Quindi, probabilmente dovrebbe trattare con la vostra parte relativa così:

if (relative.StartsWith("/")) 
    relative = "." + relative; 
+0

hai provato questo? non fa alcuna differenza quando lo faccio. –

+0

@anders, sì, lavora per me; Modifico la mia risposta con un esempio completo; per favore, dai uno sguardo –

+3

Ah ho trovato quello che ha fatto funzionare il tuo codice e non il mio: Sembra che l'url assoluto debba anche finire con/per farlo funzionare! Ho usato string absoluteUrl = "http: // nomehost/percorso"; e non ha funzionato, ma con entrambi gli end slah dopo "path" e nessuna barra iniziale prima di "my" sembra funzionare! Questo sembra un po 'fasullo, quindi ammetto un po' di più, ma ti meriti una risposta per questo :-) –

Problemi correlati