Basierend auf meiner persönlichen Erfahrung mit ASP.NET und der Suche im Internet. Ich habe festgestellt, dass die ResolveUrl-Methode von Page uns einige ernsthafte Probleme bereitet hat.
Das häufigste Problem besteht darin, dass es nicht außerhalb des Bereichs der Seite oder des Steuerelements verwendet werden kann.
Alle anderen Probleme sind Bugs. Beispielsweise kann es einige von Ihnen angegebene URLs nicht korrekt verarbeiten. Versuchen Sie es beispielsweise mit Page.ResolveUrl("~/test.aspx?param=http://www.test.com"). Das Ergebnis ist dasselbe wie die von Ihnen eingegebene Zeichenfolge, ohne Änderungen. Bei der Verwendung von Reflector zum Anzeigen des asp.net-Codes habe ich festgestellt, dass der Mechanismus zum Konvertieren relativer URLs in absolute URLs zunächst nach „://“ in der Zeichenfolge sucht und diese, wenn sie gefunden wird, direkt zurückgibt. Wenn Sie daher einen Parameter mit „://“ übergeben, ist die Abfragezeichenfolge in Ordnung. Wir alle wissen, dass Abfragezeichenfolgenparameter urlencodiert sein sollten. Wenn dies jedoch nicht der Fall ist, sollte dies für die URL dennoch akzeptabel sein. Im Ernst, überprüfen Sie Ihren Browser.
Online ist die empfohlene Vorgehensweise die Verwendung von VirtualPathUtility.ToAbsolute, was sehr praktisch ist, wenn Sie die URL als Abfragezeichenfolge übergeben. Andernfalls wird eine Ausnahme ausgelöst. Wenn es sich um eine absolute URL handelt, wird ebenfalls eine Ausnahme ausgelöst!
Also beschloss ich, nach einer endgültigen Lösung zu suchen.
Zuerst suche ich nach einer guten Variablen, die uns den virtuellen Pfad liefert, während die Anwendung ausgeführt wird, ohne den Seitenkontext zu verwenden.
Ich habe HttpRuntime.AppDomainAppVirtualPath verwendet. Es kann überall verwendet werden – sogar in Timer-Rückrufen! Es gibt keinen abschließenden Schrägstrich im Pfad, ASP.NET hat die Schrägstriche eigenwillig entfernt, aber wir können es beheben :-)
Dann habe ich einige Tests mit dem ursprünglichen ResolveUrl-Code durchgeführt und herausgefunden, wie ich ihn durch AppVirtualPath ersetzen kann:
1. Wenn die URL mit einem Schrägstrich (/ oder ) beginnt, wird sie nicht geändert!
2. Wenn die URL mit 〜/ beginnt, wird sie durch AppVirtualPath ersetzt.
3. Wenn es sich bei der URL um eine absolute URL handelt, wird sie nicht geändert.
4. In allen anderen Fällen (auch wenn sie mit 〜 anstelle eines Schrägstrichs beginnen) wird die URL an den AppVirtualPath angehängt.
5. Bei jeder Änderung der URL werden auch Schrägstriche korrigiert. Entfernen Sie den doppelten Schrägstrich und ersetzen Sie durch /.
Code:
Code
öffentliche statische Zeichenfolge ResolveUrl(string relativeUrl)
{
if (relativeUrl == null) throw new ArgumentNullException("relativeUrl");
if (relativeUrl.Length == 0 || relativeUrl[0] == '/' ||
relativeUrl[0] == '\') return relativeUrl;
int idxOfScheme =
relativeUrl.IndexOf(@"://", StringComparison.Ordinal);
if (idxOfScheme != -1)
{
int idxOfQM = relativeUrl.IndexOf('?');
if (idxOfQM == -1 || idxOfQM > idxOfScheme) return relativeUrl;
}
StringBuilder sbUrl = new StringBuilder();
sbUrl.Append(HttpRuntime.AppDomainAppVirtualPath);
if (sbUrl.Length == 0 || sbUrl[sbUrl.Length - 1] != '/') sbUrl.Append('/');
// Fragezeichen bereits gefunden? Abfragezeichenfolge, nicht berühren!
bool FoundQM = false;
bool FoundSlash; // Das letzte Zeichen war ein Schrägstrich?
if (relativeUrl.Length > 1
&& relativeUrl[0] == '~'
&& (relativeUrl[1] == '/' || relativeUrl[1] == '\'))
{
relativeUrl = relativeUrl.Substring(2);
FoundSlash = true;
}
sonst FoundSlash = false;
foreach (char c in relativeUrl)
{
if (!foundQM)
{
if (c == '?') FoundQM = true;
anders
{
if (c == '/' || c == '\')
{
if (foundSlash) continue;
anders
{
sbUrl.Append('/');
FoundSlash = true;
weitermachen;
}
}
else if (foundSlash) FoundSlash = false;
}
}
sbUrl.Append(c);
}
return sbUrl.ToString();
}
Nachdem ich den Code fertiggestellt und den ursprünglichen ResolveUrl-Test immer wieder verglichen hatte, begann ich mit dem Testen der Leistung ... In den meisten Fällen wurde mein Code 2,7-mal schneller ausgeführt als der ursprüngliche ResolveUrl! Ich habe es auch in einer Schleife getestet und den Code 100.000 Mal mit verschiedenen URLs ausgeführt.
Referenz-Originaltext: http://www.codeproject.com/KB/aspnet/resolveurl.aspx
Autor: Zhu Qilin Quelle: http://zhuqil.cnblogs.com
Das Urheberrecht dieses Artikels liegt beim Autor und bei Blog Park. Ein Nachdruck ist jedoch ohne Zustimmung des Autors gestattet und ein Link zum Originaltext muss an einer offensichtlichen Stelle auf der Artikelseite angebracht werden. die Geltendmachung einer gesetzlichen Haftung bleibt vorbehalten.