2009-03-24 3 views
12

Я ретро-фитинг приложение, чтобы сделать использование PHP HTTP прокси (для кэширования) вместо фактического сервера API, приложение в настоящее время объединяет в себе сервер URI и путь с кодом:Комбинирование URIs и Дорожки

methodUri = new Uri(apiUri, method.Path) 

Где:

  • apiUri = "http://api.eve-online.com/" (System.Uri объекта)
  • method.Path = «/ символ/Ск illIntraining.xml.aspx»(строка)

Результат выше утверждения

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

Чтобы использовать PHP HTTP прокси-сервер запрос должен быть изменен следующим образом

Выход я ожидал был:

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

Однако выход я получаю:

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

I понять, что это правильная функциональность конструктора Uri (Uri, string), мой вопрос в том, что было бы лучшей функцией или конструктором для использования на своем месте, чтобы получить ожидаемый результат? Я попытался удалить ведущий «/» в методе. Пат, беря его с абсолютного пути к относительному пути, но это не помогло.

Примечание: оба решения ниже работают, однако System.UriBuilder обеспечивает более надежный механизм для объединения адресов URI и пути и в моем случае привело к уменьшению числа изменений ресурсов, чем при использовании System.Uri. Если бы у меня был выбор, я бы поставил оба ответа правильно.

ответ

23

Не используйте объект Uri, используйте UriBuilder - он справляется гораздо лучше с недостающие косые

Так

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

работает как ожидалось, и производит http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx

+0

Вы правы System.UriBuilder - это более надежный способ создания URI, спасибо. –

+2

Обратите внимание, что путь будет закодирован в URL, поэтому, если в нем добавлена ​​строка запроса, символы« и »будут закодированы. слабость в этом методе, как описано. –

+0

'UriBuilder' имеет отдельное свойство Query для строк запроса, которое рекомендуется, так как оно правильно обрабатывает кодировку символов для этого случая использования. –

7

Добавить завершающую «/» в apiUri и снимите ведущий «/» от 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

Нет ли инструмента, который бы разрешил эту проблему добавления и вычитания «/» с одной или другой стороны? – Marty

+0

Если вы положили косую черту на добавляемый бит, конструктор Uri полагает, что он относительно базы, поэтому вы получаете «http://www.base.com/bit-you-are-adding.html», , если вы оставите лидирующую косую черту, она предполагает, что она относится к оригинальному Uri, давая вам «http://www.base.com/OriginalUri/bit-you-are-adding.html " – galamdring