Estoy realmente sorprendido de que no exista un método nativo .NET para obtener una url absoluta a partir de una url relativa. Sé que esto se ha discutido muchas veces, pero nunca he encontrado un método satisfactorio que maneje esto bien. ¿Puede ayudar a afinar el método a continuación?
Creo que todo lo que necesito es elegir automáticamente el protocolo en lugar de codificarlo (http/https). ¿Algo más que me falte (advertencias, rendimiento, etc.)?
public static string GetAbsoluteUrl(string url)
{
//VALIDATE INPUT FOR ALREADY ABSOLUTE URL
if (url.StartsWith("http://", StringComparison.OrdinalIgnoreCase)
|| url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
{
return url;
}
//GET PAGE REFERENCE FOR CONTEXT PROCESSING
Page page = HttpContext.Current.Handler as Page;
//RESOLVE PATH FOR APPLICATION BEFORE PROCESSING
if (url.StartsWith("~/"))
{
url = page.ResolveUrl(url);
}
//BUILD AND RETURN ABSOLUTE URL
return "http://" + page.Request.ServerVariables["SERVER_NAME"] + "/"
+ url.TrimStart('/');
}
Con ASP.NET, es necesario considerar el punto de referencia para una "URL relativa" - ¿es relativa a la solicitud de página, un control de usuario, o si es "relativa" simplemente en virtud de la utilización de "~/"?
La clase Uri
contiene una forma sencilla de convertir una URL relativa en una URL absoluta (dada una URL absoluta como punto de referencia para la URL relativa):
var uri = new Uri(absoluteUrl, relativeUrl);
Si relativeUrl
es de hecho una URL aboluta, entonces se ignora absoluteUrl
.
La única pregunta que queda es cuál es el punto de referencia, y si "~/" URLs están permitidos (el constructor Uri
no los traduce).
Todavía nada lo suficientemente bueno usando material nativo. Esto es lo que conseguí:
public static string GetAbsoluteUrl(string url)
{
//VALIDATE INPUT
if (String.IsNullOrEmpty(url))
{
return String.Empty;
}
//VALIDATE INPUT FOR ALREADY ABSOLUTE URL
if (url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
{
return url;
}
//GET CONTEXT OF CURRENT USER
HttpContext context = HttpContext.Current;
//RESOLVE PATH FOR APPLICATION BEFORE PROCESSING
if (url.StartsWith("~/"))
{
url = (context.Handler as Page).ResolveUrl(url);
}
//BUILD AND RETURN ABSOLUTE URL
string port = (context.Request.Url.Port != 80 && context.Request.Url.Port != 443) ? ":" + context.Request.Url.Port : String.Empty;
return context.Request.Url.Scheme + Uri.SchemeDelimiter + context.Request.Url.Host + port + "/" + url.TrimStart('/');
}