Esiste un metodo che verifica se 2 URL sono uguali, ovvero puntano allo stesso punto. Non sto parlando di circa 2 URL con diversi nomi di dominio che puntano allo stesso indirizzo IP, ma per esempio 2 URL che puntano alla stessa pagina aspx:Verifica se 2 URL sono uguali
è uguale a questi:
- http://example.com/Products/Default.aspx
- http://example.com/Products/
- ~/Prodotti/Default.aspx
- ~/Prodotti/
Nota/assumtions
- valori QueryString vengono ignorati
- ASP.NET (C#) Pref
- Default.aspx è la pagina predefinita
---- AGGIORNAMENTO ----
Questo è un metodo molto grezzo che verifica un URL per vedere se corrisponde all'URL corrente: Ho provato a creare un nuovo Uri() con entrambi gli URL locali e di controllo ma non so che funziona e sono andato giù per la stringa controllando viale. L'implementazione di SiteMapProvider ignora questo passaggio se l'URL inizia con "Http" in quanto ciò presuppone un URL esterno. Dal momento che ho un framework SaaS che garantirà sempre percorsi relativi (come questi possono essere su sottodomini diversi) è più facile eliminare le cose.
Eventuali commenti sull'ottimizzazione? Immagino che per cominciare possiamo passare una variabile contenente l'URL corrente? Non sei sicuro dell'overhead di chiamare HttpContext.Current.Request.Url.LocalPath molte volte?
/// <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;
}
Si prega di notare, il codice di cui sopra non è completamente testato e richiede l'ottimizzazione. Lo aggiornerò attraverso i test. Qualsiasi suggerimento benvenuto. –
@Mark: Probabilmente sarebbe un po 'più facile usare la classe 'Uri'. Tutto quello che devi stringere a corda è sostituire '~' con l'attuale URL di base, quindi creare oggetti 'Uri' dagli URL e fare semplicemente un confronto di equivalenza. Questo eliminerebbe molto del codice che hai nella tua soluzione. – JAB
(Fondamentalmente, la classe 'Uri' fa la maggior parte se non tutte quelle tecniche di normalizzazione per te.) – JAB