Uniendo URLs en C# correctamente: tutorial sobre Path.Combine para la web

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué Path.Combine rompe las URLs y cómo solucionarlo?



Imagine: está escribiendo una aplicación en C# que se comunica con una API. Necesita construir una URL como https://api.example.com/v1/users/123. Lo primero que viene a la mente es usar el conocido Path.Combine. Y esto es un error que cometen miles de desarrolladores. La pregunta «Path.Combine for URLs?» en Stack Overflow ha acumulado cientos de miles de visitas, y no es por casualidad.



En este artículo, analizaremos por qué Path.Combine es mortalmente peligroso para las URLs y mostraremos 4 formas correctas de unir direcciones en C#. Aprenderá cómo funciona UriBuilder, por qué vale la pena considerar la librería Flurl y cómo escribir su propio método seguro para combinar URLs. ¡Allá vamos!



El problema: ¿qué tiene de malo Path.Combine?



El método Path.Combine fue creado para sistemas de archivos de Windows. Utiliza la barra invertida (\\) y tiene en cuenta las particularidades de las unidades (por ejemplo, C:\\). La URL, en cambio, funciona con la barra diagonal (/) y no tiene el concepto de «unidad». Veamos un ejemplo:



string baseUrl = "https://api.example.com/api";string endpoint = "/users/123";string result = Path.Combine(baseUrl, endpoint);Console.WriteLine(result);// Salida: https:\\\\api.example.com\\api\\users\\123 (en Windows)// O peor aún: https://api.example.com/api/users/123 (si tiene suerte)


El resultado, por decirlo suavemente, no es válido. Path.Combine reemplaza las barras diagonales por barras invertidas (en Windows), y su solicitud HTTP fallará con un error. Incluso si en Linux todo parece normal, el código se vuelve no portable. ¿Y si la URL base ya tiene una barra al final? ¿O si el endpoint tiene una barra doble? Empieza el caos.



Ejemplo real de Stack Overflow

Una de las respuestas más populares a la pregunta «Path.Combine for URLs?» (autor: Brian, más de 600 votos positivos) comienza con la frase: «Por favor, no hagan esto. Path.Combine es para archivos, no para URLs». Y esta es una regla de oro. Analicemos qué herramientas ofrece C# para trabajar con URLs de forma segura.



Método 1: Uri.TryCreate — método integrado de .NET



La primera y más obvia forma es usar la clase Uri. Esta sabe cómo combinar correctamente una URL base y una ruta relativa:



string baseUrl = "https://api.example.com/api";string relativePath = "/users/123";

if (Uri.TryCreate(baseUrl, relativePath, out Uri result)){ Console.WriteLine(result.ToString()); // Salida: https://api.example.com/users/123}else{ Console.WriteLine("URL no válida");}


Importante: el segundo argumento de TryCreate debe ser un URI relativo (que comience con /). Si pasa simplemente "users/123", se interpretará como absoluto y el resultado será incorrecto. No es el método más flexible, pero para casos simples es una excelente solución integrada.



Método 2: UriBuilder — potente y flexible



La clase UriBuilder le da control total sobre cada parte de la URL: esquema, host, puerto, ruta y parámetros de consulta. Es la elección ideal cuando necesita construir una dirección compleja:



var builder = new UriBuilder("https://api.example.com");builder.Port = 8080;builder.Path = "/api/v1/users";builder.Query = "page=1&limit=10";

Uri uri = builder.Uri;Console.WriteLine(uri.ToString());// Salida: https://api.example.com:8080/api/v1/users?page=1&limit=10


¿Por qué es genial?

  • Escapado automático — los caracteres especiales en los parámetros de consulta se codificarán.
  • Barras correctas — UriBuilder agrega o elimina barras sobrantes por sí mismo.
  • Puertos y esquemas — es fácil cambiar http a https o agregar un puerto.


Pero hay un detalle: Path

Blogs

Book Recommendations