Basé sur mon expérience personnelle avec ASP.NET et grâce à des recherches sur Internet. J'ai trouvé que la méthode ResolveUrl de Page nous posait de sérieux problèmes.
Le problème le plus courant est qu’il ne peut pas être utilisé en dehors de la portée de la page ou du contrôle.
Tous les autres problèmes sont des bugs. Par exemple, il ne peut pas gérer correctement certaines URL que vous indiquez. Par exemple, essayez Page.ResolveUrl("~/test.aspx?param=http://www.test.com"). Le résultat est le même que la chaîne que vous avez saisie, sans aucune modification. En utilisant Reflector pour afficher le code asp.net, j'ai découvert que le mécanisme de conversion des URL relatives en URL absolues recherche d'abord "://" dans la chaîne et, s'il est trouvé, le renvoie directement. Par conséquent, si vous transmettez un paramètre avec ://, la chaîne de requête est OK. Nous savons tous que les paramètres de chaîne de requête doivent être codés en urlen, mais sinon, ils devraient toujours être acceptables pour l'URL. Sérieusement, vérifiez votre navigateur.
En ligne, l'approche recommandée consiste à utiliser VirtualPathUtility.ToAbsolute, ce qui est assez pratique et pratique si vous transmettez l'URL sous forme de chaîne de requête,... sinon, une exception sera levée. S'il s'agit d'une URL absolue, elle lèvera également une exception !
J'ai donc décidé de chercher une solution finale.
Tout d'abord, je recherche une bonne variable qui nous donnera le chemin virtuel pendant l'exécution de l'application, sans utiliser le contexte de la page.
J'ai utilisé HttpRuntime.AppDomainAppVirtualPath. Il peut être utilisé n'importe où, même lors des rappels programmés ! Il n'y a pas de barre oblique finale dans le chemin, ASP.NET a éliminé les barres obliques de manière idiosyncratique, mais nous pouvons le corriger :-)
Ensuite, j'ai fait quelques tests en utilisant le code ResolveUrl d'origine et j'ai découvert comment le remplacer par AppVirtualPath :
1. Lorsque l’URL commence par une barre oblique (/ ou ), elle ne sera pas modifiée !
2. Lorsque l'URL commence par 〜/, elle sera remplacée par AppVirtualPath.
3. Lorsque l'URL est une URL absolue, elle ne sera pas modifiée.
4. Dans tous les autres cas (même en commençant par 〜 au lieu d'une barre oblique), l'URL sera ajoutée à AppVirtualPath.
5. Chaque fois qu'il modifie l'URL, il corrige également les barres obliques. Supprimez la double barre oblique et remplacez par /.
Code:
code
chaîne statique publique ResolveUrl (chaîne relativeUrl)
{
if (relativeUrl == null) throw new ArgumentNullException("relativeUrl");
if (relativeUrl.Length == 0 || relativeUrl[0] == '/' ||
relativeUrl[0] == '\') return relativeUrl;
int idxOfScheme =
relativeUrl.IndexOf (@"://", StringComparison.Ordinal);
si (idxOfScheme != -1)
{
int idxOfQM = relativeUrl.IndexOf('?');
if (idxOfQM == -1 || idxOfQM > idxOfScheme) renvoie relativeUrl ;
}
StringBuilder sbUrl = new StringBuilder();
sbUrl.Append(HttpRuntime.AppDomainAppVirtualPath);
if (sbUrl.Length == 0 || sbUrl[sbUrl.Length - 1] != '/') sbUrl.Append('/');
// Vous avez déjà trouvé un point d'interrogation ? Chaîne de requête, ne touchez pas !
bool trouvéQM = faux ;
bool foundSlash ; // le dernier caractère était une barre oblique ?
si (relativeUrl.Length > 1
&& URL relative[0] == '~'
&& (relativeUrl[1] == '/' || relativeUrl[1] == '\'))
{
relativeUrl = relativeUrl.Substring(2);
foundSlash = vrai ;
}
sinon foundSlash = false ;
foreach (char c dans relativeUrl)
{
si (!foundQM)
{
if (c == '?') foundQM = true;
autre
{
si (c == '/' || c == '\')
{
if (foundSlash) continue ;
autre
{
sbUrl.Append('/');
foundSlash = vrai ;
continuer;
}
}
sinon si (foundSlash) foundSlash = false ;
}
}
sbUrl.Append(c);
}
return sbUrl.ToString();
}
Après avoir terminé le code et comparé le test ResolveUrl d'origine encore et encore, j'ai commencé à tester les performances... Dans la plupart des cas, mon code s'est exécuté 2,7 fois plus rapidement que le ResolveUrl d'origine ! Je l'ai également testé en boucle, en exécutant le code 100 000 fois avec différentes URL.
Texte original de référence : http://www.codeproject.com/KB/aspnet/resolveurl.aspx
Auteur : Zhu Qilin Source : http://zhuqil.cnblogs.com
Le droit d'auteur de cet article appartient à l'auteur et à Blog Park. La réimpression est la bienvenue. Cependant, cette déclaration doit être conservée sans le consentement de l'auteur et un lien vers le texte original doit être fourni à un endroit évident sur la page de l'article. le droit de poursuivre la responsabilité juridique est réservé.