¿Hay un método alrededor de esas pruebas si 2 URL son iguales, es decir, apuntan al mismo lugar? No estoy hablando de alrededor de 2 direcciones URL con diferentes nombres de dominio que apuntan a la misma dirección IP, pero por ejemplo 2 URLs que apunten a la misma página .aspx:Compruebe si 2 URL son iguales
es igual a las siguientes:
- http://example.com/Products/Default.aspx
- http://example.com/Products/
- ~/Productos/Default.aspx
- ~/Productos/
Nota/assumtions
- Valores de cadena de consulta se ignoran
- ASP.NET (C#) Pref
- Default.aspx es la página predeterminada
---- ACTUALIZACIÓN ----
Este es un método muy crudo que prueba una URL para ver si coincide con la URL actual: Intenté crear una nueva Uri() con las URL locales y de verificación pero no sé que funciona y bajé la cadena revisando la avenida. La implementación de SiteMapProvider omite este paso si la URL comienza con "Http", ya que supone una URL externa. Como tengo un marco SaaS que siempre asegurará las rutas relativas (ya que pueden estar en diferentes subdominios) es más fácil desmantelar las cosas.
¿Algún comentario sobre la optimización? Supongo que para empezar, podemos pasar una variable que contiene la URL actual. ¿No está seguro de la sobrecarga de llamar a HttpContext.Current.Request.Url.LocalPath muchas veces?
/// <summary>
/// Assumes URL is relative aspx page or folder path
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static bool CurrentURLMatch(string url)
{
string localURL = HttpContext.Current.Request.Url.LocalPath;
if (HttpContext.Current.Request.Url.Host == "localhost")
{
localURL = localURL.Substring(localURL.IndexOf('/') + 1);
localURL = localURL.Substring(localURL.IndexOf('/'));
}
string compareURL = url.ToLower();
// Remove QueryString Values
if (localURL.Contains("?"))
{
localURL = localURL.Split('?')[0];
}
if (compareURL.Contains("?"))
{
compareURL = compareURL.Split('?')[0];
}
if (localURL.Contains("#"))
{
localURL = localURL.Split('#')[0];
}
if (compareURL.Contains("?"))
{
compareURL = compareURL.Split('#')[0];
}
// Prepare End of Local URL
if (!localURL.Contains("aspx"))
{
if (!localURL.EndsWith("/"))
{
localURL = String.Concat(localURL, "/");
}
}
// Prepare End of Compare URL
if (!compareURL.Contains("aspx"))
{
if (!compareURL.EndsWith("/"))
{
compareURL = String.Concat(localURL, "/");
}
}
if (localURL.EndsWith(@"/"))
{
localURL = String.Concat(localURL, "Default.aspx");
}
if (compareURL.EndsWith(@"/"))
{
compareURL = String.Concat(compareURL, "Default.aspx");
}
if (compareURL.Contains(@"//"))
{
compareURL = compareURL.Replace(@"//", String.Empty);
compareURL = compareURL.Substring(compareURL.IndexOf("/") + 1);
}
compareURL = compareURL.Replace("~", String.Empty);
if (localURL == compareURL)
{
return true;
}
return false;
}
Tenga en cuenta, el código anterior no se ha probado y requiere la optimización totalmente. Lo actualizaré a través de pruebas. Cualquier sugerencia bienvenida –
@Mark: Sin embargo, probablemente sería un poco más fácil usar la clase 'Uri'. Todo lo que tendrías que hacer con la cadena es reemplazar '~' con la URL base actual, luego crear objetos 'Uri' a partir de las URL y simplemente hacer una comparación de equivalencia. Eso eliminaría una gran cantidad del código que tienes en tu solución. – JAB
(Básicamente, la clase 'Uri' hace la mayoría si no todas esas técnicas de normalización) – JAB