2009-03-24 35 views
12

estoy retro-ajuste de una aplicación para hacer uso de un proxy PHP HTTP (para el almacenamiento en caché) en lugar del servidor API actual, la aplicación actualmente combina el servidor URI y la ruta con el código:URI Combinando y rutas

methodUri = new Uri(apiUri, method.Path) 

Donde:

El resultado de la declaración anterior es

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

Para usar el proxy HTTP PHP petición tendría que ser cambiado de la siguiente manera

La salida me esperaba era:

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

Sin embargo la salida que recibo es:

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

I Entiendo que esta es la funcionalidad correcta del constructor Uri (Uri, cadena), mi pregunta es ¿cuál sería una mejor función o constructor para usar en su lugar para obtener la salida que espero? He intentado eliminar el método "/" principal. Sin embargo, tomarlo de una ruta absoluta a una ruta relativa no fue de ayuda.

NOTA: ambas soluciones por debajo de hacer el trabajo, sin embargo System.UriBuilder proporciona un mecanismo más robusto para combinar URI de caminos y en mi caso dado lugar a un menor número de cambios en el uso de recursos que System.Uri. Si tuviera la opción, marcaría ambas respuestas como correctas.

Respuesta

23

No utilice el objeto Uri, utilice un UriBuilder - hace frente de mejor manera con barras que faltan

Así

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

funciona como se espera y produce http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx

+0

Tiene la razón System.UriBuilder es una forma más sólida de compilar URI, gracias. –

+2

Tenga en cuenta que la ruta tendrá codificación URL, por lo que si la adición contiene una cadena de consulta, los caracteres? y & se codificarán. Esto es una debilidad en este método como se describe. –

+0

'UriBuilder' tiene una propiedad Query separada para cadenas de consulta, que se recomienda ya que maneja la codificación de caracteres correctamente para ese caso de uso. –

7

Añadir una "/" para apiUri, y eliminar el principal "/" de 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

¿No hay una herramienta que resuelva el problema de sumar y restar "/" de un lado o del otro? – Marty

+0

Si coloca la barra diagonal en el bit que está agregando, el constructor de Uri piensa que es relativo a la base, por lo que obtiene "http://www.base.com/bit-you-are-adding.html" , si deja de lado la barra diagonal, asume que es relativa al Uri original, lo que le da "http://www.base.com/OriginalUri/bit-you-are-adding.html " – galamdring