Berdasarkan pengalaman pribadi saya menggunakan ASP.NET, dan melalui pencarian di Internet. Saya menemukan bahwa metode ResolveUrl Page membawa beberapa masalah serius kepada kami.
Masalah paling umum adalah tidak dapat digunakan di luar cakupan halaman atau kontrol.
Semua masalah lainnya adalah bug. Misalnya, ia tidak dapat menangani beberapa URL yang Anda berikan dengan benar. Misalnya, coba Page.ResolveUrl("~/test.aspx?param=http://www.test.com"). Hasilnya sama dengan string yang Anda masukkan, tanpa perubahan apa pun. Menggunakan Reflektor untuk melihat kode asp.net, saya menemukan bahwa mekanisme untuk mengubah URL relatif menjadi URL absolut pertama-tama mencari "://" dalam string, dan jika ditemukan, langsung mengembalikannya. Oleh karena itu, jika Anda meneruskan parameter dengan ://, string kuerinya OK. Kita semua tahu bahwa parameter string kueri harus diberi kode urlen, namun jika tidak, parameter tersebut tetap dapat diterima untuk URL. Serius, periksa browser Anda.
Secara online, pendekatan yang disarankan adalah menggunakan VirtualPathUtility.ToAbsolute, yang cukup bagus dan nyaman jika Anda meneruskan URL sebagai string kueri,...jika tidak, pengecualian akan diberikan. Jika itu adalah URL absolut, itu juga akan memunculkan pengecualian!
Jadi, saya memutuskan untuk mencari solusi akhir.
Pertama, saya mencari variabel bagus yang akan memberi kita jalur virtual saat aplikasi sedang berjalan, tanpa menggunakan konteks halaman.
Saya menggunakan HttpRuntime.AppDomainAppVirtualPath. Ini dapat digunakan di mana saja - bahkan dalam panggilan balik pengatur waktu! Tidak ada garis miring di jalurnya, ASP.NET secara khusus telah menghilangkan garis miring tersebut, tetapi kita dapat memperbaikinya :-)
Kemudian, saya melakukan beberapa pengujian menggunakan kode ResolveUrl asli dan menemukan cara menggantinya dengan AppVirtualPath:
1. Jika URL diawali dengan garis miring (/ atau ), maka tidak akan diubah!
2. Jika URL dimulai dengan 〜/, maka akan digantikan oleh AppVirtualPath.
3. Jika URL adalah URL absolut, maka tidak akan diubah.
4. Dalam kasus lain (bahkan dimulai dengan 〜 bukannya garis miring), URL akan ditambahkan ke AppVirtualPath.
5. Setiap kali URL diubah, garis miring juga diperbaiki. Hapus garis miring ganda dan ganti dengan /.
Kode:
kode
string statis publik ResolveUrl(string relativeUrl)
{
if (relativeUrl == null) melempar ArgumentNullException("relativeUrl");
if (relativeUrl.Length == 0 || relativeUrl[0] == '/' ||
relativeUrl[0] == '\') mengembalikan relativeUrl;
int idxOfScheme =
relativeUrl.IndexOf(@"://", StringComparison.Ordinal);
jika (idxOfScheme != -1)
{
int idxOfQM = relativeUrl.IndexOf('?');
jika (idxOfQM == -1 || idxOfQM > idxOfScheme) mengembalikan relativeUrl;
}
StringBuilder sbUrl = StringBuilder baru();
sbUrl.Append(HttpRuntime.AppDomainAppVirtualPath);
if (sbUrl.Panjang == 0 || sbUrl[sbUrl.Panjang - 1] != '/') sbUrl.Append('/');
// sudah menemukan tanda tanya? string kueri, jangan sentuh!
bool ditemukanQM = false;
bool foundSlash; // karakter terbaru adalah garis miring?
jika (relatifUrl.Panjang > 1
&& relativeUrl[0] == '~'
&& (relativeUrl[1] == '/' || relativeUrl[1] == '\'))
{
relativeUrl = relativeUrl.Substring(2);
foundSlash = benar;
}
lain ditemukanSlash = false;
foreach (char c di relativeUrl)
{
jika (!ditemukanQM)
{
jika (c == '?') ditemukanQM = benar;
kalau tidak
{
jika (c == '/' || c == '\')
{
jika (foundSlash) lanjutkan;
kalau tidak
{
sbUrl.Tambahkan('/');
foundSlash = benar;
melanjutkan;
}
}
lain jika (foundSlash) foundSlash = false;
}
}
sbUrl.Tambahkan(c);
}
kembalikan sbUrl.ToString();
}
Setelah menyelesaikan kode dan membandingkan pengujian ResolveUrl asli berulang kali, saya mulai menguji kinerja... Dalam kebanyakan kasus, kode saya dieksekusi 2,7 kali lebih cepat daripada ResolveUrl asli! Saya juga mengujinya di dalam satu lingkaran, mengeksekusi kode 100.000 kali dengan URL berbeda.
Referensi teks asli: http://www.codeproject.com/KB/aspnet/resolveurl.aspx
Penulis: Zhu Qilin Sumber: http://zhuqil.cnblogs.com
Hak cipta artikel ini adalah milik penulis dan Blog Park. Pencetakan ulang diperbolehkan. Namun, pernyataan ini harus disimpan tanpa persetujuan penulis, dan tautan ke teks asli harus disediakan di posisi yang jelas di halaman artikel. hak untuk menuntut tanggung jawab hukum dilindungi undang-undang.