2009-03-24 13 views
12

Io sono retro-fitting un'applicazione di fare uso di un proxy PHP HTTP (per il caching) invece del server API attuale, l'applicazione attualmente unisce il server URI e il percorso con il codice:Combinando URI e percorsi

methodUri = new Uri(apiUri, method.Path) 

Dove:

Il risultato della dichiarazione di cui sopra è

"http://api.eve-online.com/char/SkillIntraining.xml.aspx" (System.Uri Object) 

Per utilizzare il proxy HTTP PHP la richiesta deve essere cambiato come segue

L'uscita mi aspettavo era:

"http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx" (System.Uri Object) 

Tuttavia l'output che ottengo è:

"http://www.r-s.co.uk/char/SkillIntraining.xml.aspx" (System.Uri Object) 

I Capisco che questa è la funzionalità corretta del costruttore Uri (Uri, stringa), la mia domanda è quale sarebbe una funzione o costruttore migliore da utilizzare al suo posto per ottenere l'output che mi aspetto? Ho provato a rimuovere il principale "/" in method.Path portarlo da un percorso assoluto a un percorso relativo che tuttavia non ha aiutato.

NOTA: entrambe le soluzioni di seguito funzionano, tuttavia System.UriBuilder fornisce un meccanismo più robusto per combinare URI e percorsi e nel mio caso portato a un minor numero di modifiche alle risorse rispetto all'utilizzo System.Uri. Se avessi la scelta, segnerei entrambe le risposte come corrette.

risposta

23

Non utilizzare l'oggetto Uri, utilizzare un UriBuilder - si fa fronte modo migliore con barre mancanti

Così

Uri apiUri = new Uri("http://www.r-s.co.uk/eproxy.php"); 
string methodPath = "/char/SkillIntraining.xml.aspx"; 

System.UriBuilder uriBuilder = new System.UriBuilder(apiUri); 
uriBuilder.Path += methodPath; 

Console.WriteLine(uriBuilder.Uri.ToString()); 

funziona come previsto e produce http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx

+0

Sei corretto System.UriBuilder è un modo più robusto per costruire URI, grazie –

+2

Nota che il percorso sarà codificato come URL, quindi se l'aggiunta contiene una stringa di interrogazione i caratteri? e & saranno codificati. una debolezza in questo metodo come descritto: –

+0

'UriBuilder' ha una proprietà Query separata per le stringhe di query, che è raccomandata man mano che gestisce la codifica dei caratteri per quel caso d'uso –

7

Aggiungi un trailing "/" per apiUri, e rimuovere il principale "/" da method.Path:

 Uri apiUri = new Uri("http://www.r-s.co.uk/eproxy.php/"); 
     string path = "char/SkillIntraining.xml.aspx"; 
     Uri uri = new Uri(apiUri, path); 
     Console.WriteLine(uri.ToString()); 
+2

Non c'è uno strumento che risolva questo problema di aggiungere e sottrarre "/" da una parte o dall'altra? – Marty

+0

Se metti la barra iniziale sul bit che stai aggiungendo, il costruttore Uri pensa che sia relativo alla base, quindi ottieni "http://www.base.com/bit-you-are-adding.html" , se si lascia la barra iniziale, si presuppone che sia relativo all'originale Uri, fornendo "http://www.base.com/OriginalUri/bit-you-are-adding.html " – galamdring