2009-03-24 14 views
12

Ich bin Nachrüsten eine Anwendung Verwendung eines PHP HTTP-Proxy zu machen (für Caching) anstelle des eigentlichen API-Server die Anwendung zur Zeit verbindet der Server-URI und der Pfad mit dem Code:Kombination URIs und Pfade

methodUri = new Uri(apiUri, method.Path) 

Wo:

Das Ergebnis der obigen Aussage ist

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

Um den PHP HTTP-Proxy zu verwenden, die Anforderung geändert werden müßte, als

Der Ausgang Ich hatte erwartet, war:

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

jedoch der Ausgang ich erhalte, ist:

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

I verstehe, dass dies die korrekte Funktionalität des Konstruktors Uri (Uri, String) ist, meine Frage ist, was wäre eine bessere Funktion oder Konstruktor an ihrer Stelle zu verwenden, um die Ausgabe zu erhalten, die ich erwarte? Ich habe versucht, das führende "/" in method.Path zu entfernen, das es von einem absoluten Weg zu einem relativen Weg nimmt, aber das half nicht.

HINWEIS: beiden Lösungen unten funktionieren, aber System.UriBuilder einen robusteren Mechanismus sorgt für die Kombination von URIs und Pfaden und in meinem Fall in weniger Veränderungen führte zu Ressourcen als System.Uri verwenden. Hätte ich die Wahl, würde ich beide Antworten als richtig markieren.

Antwort

23

Verwenden Sie den Uri-Objekt nicht, verwenden Sie ein UriBuilder - es meistert Art und Weise besser mit fehlende Schrägstriche

so

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

funktioniert wie erwartet und produziert http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx

+0

Sie sind richtig System.UriBuilder ist eine robustere Methode zum Erstellen von URIs, danke. –

+2

Beachten Sie, dass der Pfad URL-codiert sein wird, wenn der Zusatz eine Abfragezeichenfolge enthält, werden die Zeichen? und & codiert eine Schwäche in dieser Methode wie beschrieben –

+0

'UriBuilder' hat eine separate Query-Eigenschaft für Query-Strings, die empfohlen wird, da es die Zeichencodierung für diesen Anwendungsfall korrekt behandelt –

7

einen nachgestellten hinzufügen "/" zu apiUri, und entfernen Sie die führende "/" von 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

Gibt es kein Werkzeug, das dieses Problem des Hinzufügens und Subtrahierens von "/" von der einen oder anderen Seite löst? – Marty

+0

Wenn Sie den führenden Schrägstrich auf das Bit setzen, das Sie hinzufügen, denkt der Uri-Konstruktor, dass es relativ zur Basis ist, also erhalten Sie "http://www.base.com/bit-you-are-adding.html" , wenn Sie den führenden Schrägstrich weglassen, nimmt es an, dass es relativ zum ursprünglichen Uri ist und Ihnen "http://www.base.com/OriginalUri/bit-you-are-adding gibt.html " – galamdring