2009-03-24 15 views
12

Jestem retro sylwetkę aplikację do korzystania z serwera proxy PHP HTTP (dla buforowania) zamiast rzeczywistego serwera API, aplikacja obecnie łączy serwer URI i ścieżki z kodem:Łączenie URI i ścieżki

methodUri = new Uri(apiUri, method.Path) 

gdzie:

Wynikiem powyższego stwierdzenia jest

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

Aby użyć proxy PHP HTTP wniosek musiałby zostać zmieniony w następujący sposób

Wyjście Spodziewałem się:

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

Jednak wyjście pojawia się:

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

I Rozumiem, że jest to poprawna funkcja konstruktora Uri (Uri, string), moje pytanie brzmi, jaka byłaby lepsza funkcja lub konstruktor do użycia w tym miejscu, aby uzyskać oczekiwany wynik? Próbowałem usunąć wiodące "/" w method.Path biorąc je od absolutnej ścieżki do względnej ścieżki, ale to nie pomogło.

UWAGA: poniżej oba rozwiązania pracują, jednak System.UriBuilder zapewnia bardziej wydajny mechanizm łączenia URI i ścieżki, aw moim przypadku skutkowało mniejszymi zmianami zasobów niż przy użyciu System.Uri. Gdybym miał wybór, zaznaczę obie odpowiedzi jako prawidłowe.

Odpowiedz

23

Nie używać obiektu Uri, użyj UriBuilder - radzi sobie o wiele lepiej z brakujące ukośniki

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

działa zgodnie z oczekiwaniami i produkuje http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx

+0

Masz rację System.UriBuilder to bardziej niezawodny sposób budowania identyfikatorów URI, dziękuję –

+2

Zwróć uwagę, że ścieżka będzie zakodowana w URL, więc jeśli dodawanie zawiera ciąg zapytania, znaki? i & zostaną zakodowane. słabość w opisywanej metodzie –

+0

'UriBuilder' ma osobną właściwość Query dla ciągów zapytań, co jest zalecane, ponieważ poprawnie obsługuje kodowanie znaków dla tego przypadku użycia. –

7

Dodaj końcowego znaku "/", aby apiUri i usuń wiodący "/" od 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

Czy nie ma narzędzia, które rozwiązałoby ten problem dodawania i odejmowania "/" z jednej lub drugiej strony? – Marty

+0

Jeśli umieścisz wiodący ukośnik na dodawanym bicie, konstruktor Uri myśli, że jest on względny względem bazy, więc dostajesz "http://www.base.com/bit-you-are-adding.html" , jeśli nie wykonasz głównego slasha, zakłada się, że jest ono względne w stosunku do oryginalnego Uri, dając ci "http://www.base.com/OriginalUri/bit-you-are-adding.html " – galamdring