Baseado em minha experiência pessoal usando ASP.NET e pesquisando na Internet. Descobri que o método ResolveUrl de Page nos trouxe alguns problemas sérios.
O problema mais comum é que ele não pode ser usado fora do escopo da página ou do controle.
Todos os outros problemas são bugs. Por exemplo, ele não consegue lidar corretamente com alguns URLs fornecidos. Por exemplo, tente Page.ResolveUrl("~/test.aspx?param=http://www.test.com"). O resultado é o mesmo da string inserida, sem nenhuma alteração. Usando o Reflector para visualizar o código asp.net, descobri que o mecanismo para converter URLs relativos em URLs absolutos primeiro procura por "://" na string e, se encontrado, o retorna diretamente. Portanto, se você passar um parâmetro com ://, a string de consulta estará OK. Todos nós sabemos que os parâmetros da string de consulta devem ser codificados em URL, mas se não, ainda devem ser aceitáveis para o URL. Sério, verifique seu navegador.
Online, a abordagem recomendada é usar VirtualPathUtility.ToAbsolute, o que é bastante agradável e conveniente se você estiver passando a URL como string de consulta,... caso contrário, uma exceção será lançada. Se for uma URL absoluta, também lançará uma exceção!
Então, decidi procurar uma solução final.
Primeiro, estou procurando uma boa variável que nos forneça o caminho virtual enquanto o aplicativo está em execução, sem usar o contexto da página.
Usei HttpRuntime.AppDomainAppVirtualPath. Ele pode ser usado em qualquer lugar - até mesmo em retornos de chamada com temporizador! Ele não tem uma barra final no caminho, o ASP.NET eliminou idiossincraticamente as barras, mas podemos consertar isso :-)
Então, fiz alguns testes usando o código ResolveUrl original e descobri como substituí-lo pelo AppVirtualPath:
1. Quando a URL começar com uma barra (/ ou ), ela não será alterada!
2. Quando a URL começar com 〜/, ela será substituída por AppVirtualPath.
3. Quando a URL for absoluta, ela não será alterada.
4. Em qualquer outro caso (mesmo começando com 〜 em vez de uma barra), o URL será anexado ao AppVirtualPath.
5. Sempre que modifica a URL, também corrige barras. Remova a barra dupla e substitua por /.
Código:
código
string estática pública ResolveUrl(string relativoUrl)
{
if (relativeUrl == null) lance new ArgumentNullException("relativeUrl");
if (relativeUrl.Length == 0 || relativoUrl[0] == '/' ||
Url relativa[0] == '\') return Url relativa;
int idxOfScheme =
relativoUrl.IndexOf(@"://", StringComparison.Ordinal);
if (idxOfScheme! = -1)
{
int idxOfQM = relativoUrl.IndexOf('?');
if (idxOfQM == -1 || idxOfQM > idxOfScheme) retornar Url relativo;
}
StringBuilder sbUrl = new StringBuilder();
sbUrl.Append(HttpRuntime.AppDomainAppVirtualPath);
if (sbUrl.Length == 0 || sbUrl[sbUrl.Length - 1] != '/') sbUrl.Append('/');
// já encontrou o ponto de interrogação?
bool encontradoQM = falso;
bool foundSlash; // o último caractere foi uma barra?
if (relativeUrl.Length > 1
&& Url relativo[0] == '~'
&& (relativeUrl[1] == '/' || relativoUrl[1] == '\'))
{
relativoUrl = relativoUrl.Substring(2);
barra encontrada = verdadeiro;
}
senão encontrouSlash = false;
foreach (char c em relativoUrl)
{
se (!foundQM)
{
if (c == '?') encontradoQM = verdadeiro;
outro
{
se (c == '/' || c == '\')
{
if (foundSlash) continuar;
outro
{
sbUrl.Append('/');
barra encontrada = verdadeiro;
continuar;
}
}
senão if (foundSlash) foundSlash = false;
}
}
sbUrl.Append(c);
}
retornar sbUrl.ToString();
}
Depois de completar o código e comparar o teste ResolveUrl original repetidas vezes, comecei a testar o desempenho... Na maioria dos casos, meu código foi executado 2,7 vezes mais rápido que o ResolveUrl original! Também testei dentro de um loop, executando o código 100.000 vezes com URLs diferentes.
Texto original de referência: http://www.codeproject.com/KB/aspnet/resolveurl.aspx
Autor: Zhu Qilin Fonte: http://zhuqil.cnblogs.com
Os direitos autorais deste artigo pertencem ao autor e ao Blog Park. A reimpressão é bem-vinda. No entanto, esta declaração deve ser mantida sem o consentimento do autor, e um link para o texto original deve ser fornecido em uma posição óbvia na página do artigo. o direito de exercer responsabilidade legal é reservado.