Basado en mi experiencia personal usando ASP.NET y mediante búsquedas en Internet. Descubrí que el método ResolveUrl de Page nos trajo algunos problemas graves.
El problema más común es que no se puede utilizar fuera del alcance de la página o del control.
Todos los demás problemas son errores. Por ejemplo, no puede manejar correctamente algunas URL que usted proporcione. Por ejemplo, pruebe Page.ResolveUrl("~/test.aspx?param=http://www.test.com"). El resultado es el mismo que la cadena que ingresó, sin ningún cambio. Al usar Reflector para ver el código asp.net, descubrí que el mecanismo para convertir URL relativas a URL absolutas primero busca "://" en la cadena y, si lo encuentra, lo devuelve directamente. Por lo tanto, si pasa un parámetro con ://, la cadena de consulta está bien. Todos sabemos que los parámetros de la cadena de consulta deben estar codificados en URL, pero si no, aún así deberían ser aceptables para la URL. En serio, revisa tu navegador.
En línea, el enfoque recomendado es usar VirtualPathUtility.ToAbsolute, que es bastante bueno y conveniente si pasa la URL como cadena de consulta... de lo contrario, se generará una excepción. Si es una URL absoluta, ¡también generará una excepción!
Entonces decidí buscar una solución final.
Primero, estoy buscando una buena variable que nos proporcione la ruta virtual mientras la aplicación se está ejecutando, sin usar el contexto de la página.
Usé HttpRuntime.AppDomainAppVirtualPath. Se puede utilizar en cualquier lugar, ¡incluso en devoluciones de llamadas con temporizador! No tiene una barra diagonal en la ruta, ASP.NET ha eliminado las barras diagonales de manera idiosincrásica, pero podemos solucionarlo :-)
Luego, hice algunas pruebas usando el código ResolveUrl original y descubrí cómo reemplazarlo con AppVirtualPath:
1. Cuando la URL comienza con una barra diagonal (/ o ), ¡no se cambiará!
2. Cuando la URL comience con 〜/, será reemplazada por AppVirtualPath.
3. Cuando la URL es una URL absoluta, no se cambiará.
4. En cualquier otro caso (incluso comenzando con 〜 en lugar de una barra diagonal), la URL se agregará a AppVirtualPath.
5. Siempre que modifica la URL, también corrige las barras. Elimine la doble barra y reemplace con /.
Código:
código
cadena estática pública ResolveUrl (cadena URL relativa)
{
if (relativeUrl == null) lanza una nueva ArgumentNullException("relativeUrl");
if (Url relativa.Longitud == 0 || URL relativa[0] == '/' ||
URL relativa[0] == '\') return URL relativa;
int idxOfScheme =
relativaUrl.IndexOf(@"://", StringComparison.Ordinal);
si (idxOfScheme! = -1)
{
int idxOfQM = relativaUrl.IndexOf('?');
if (idxOfQM == -1 || idxOfQM > idxOfScheme) devuelve URL relativa;
}
StringBuilder sbUrl = nuevo StringBuilder();
sbUrl.Append(HttpRuntime.AppDomainAppVirtualPath);
if (sbUrl.Length == 0 || sbUrl[sbUrl.Length - 1] != '/') sbUrl.Append('/');
// ¿Ya encontraste el signo de interrogación? Cadena de consulta, ¡no lo toques!
bool encontradoQM = falso;
bool foundSlash; // ¿el último carácter fue una barra?
si (URL relativa. Longitud > 1
&& URL relativa[0] == '~'
&& (Url relativa[1] == '/' || URL relativa[1] == '\'))
{
URL relativa = URL relativa.Substring(2);
barra diagonal encontrada = verdadero;
}
más encontrado Barra oblicua = false;
foreach (carácter c en URL relativa)
{
si (! encontradoQM)
{
si (c == '?') encontradoQM = verdadero;
demás
{
si (c == '/' || c == '\')
{
si (foundSlash) continúa;
demás
{
sbUrl.Append('/');
barra diagonal encontrada = verdadero;
continuar;
}
}
de lo contrario, si (foundSlash) foundSlash = false;
}
}
sbUrl.Append(c);
}
devolver sbUrl.ToString();
}
Después de completar el código y comparar la prueba ResolveUrl original una y otra vez, comencé a probar el rendimiento... ¡En la mayoría de los casos, mi código se ejecutó 2,7 veces más rápido que el ResolveUrl original! También lo probé dentro de un bucle, ejecutando el código 100.000 veces con diferentes URL.
Texto original de referencia: http://www.codeproject.com/KB/aspnet/resolveurl.aspx
Autor: Zhu Qilin Fuente: http://zhuqil.cnblogs.com
Los derechos de autor de este artículo pertenecen al autor y Blog Park es bienvenido. Sin embargo, esta declaración debe conservarse sin el consentimiento del autor y se debe proporcionar un enlace al texto original en una posición obvia en la página del artículo. se reserva el derecho de exigir responsabilidad legal.