Saya sangat terkejut bahwa tidak ada metode .NET asli untuk mendapatkan url absolut dari url relatif. Saya tahu hal ini telah dibahas berkali-kali, tetapi tidak pernah menemukan metode yang memuaskan yang menangani hal ini dengan baik. Dapatkah Anda membantu menyempurnakan metode di bawah ini?
Saya pikir yang saya perlukan hanyalah memilih protokol secara otomatis, bukan hard coding (http/https). Adakah hal lain yang saya lewatkan (peringatan, kinerja, dll)?
public static string GetAbsoluteUrl(string url)
{
//VALIDATE INPUT FOR ALREADY ABSOLUTE URL
if (url.StartsWith("http://", StringComparison.OrdinalIgnoreCase)
|| url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
{
return url;
}
//GET PAGE REFERENCE FOR CONTEXT PROCESSING
Page page = HttpContext.Current.Handler as Page;
//RESOLVE PATH FOR APPLICATION BEFORE PROCESSING
if (url.StartsWith("~/"))
{
url = page.ResolveUrl(url);
}
//BUILD AND RETURN ABSOLUTE URL
return "http://" + page.Request.ServerVariables["SERVER_NAME"] + "/"
+ url.TrimStart('/');
}
Dengan ASP.NET, Anda perlu mempertimbangkan titik referensi untuk "relative URL" - apakah itu relatif terhadap permintaan halaman, kontrol pengguna, atau jika itu "relative" hanya berdasarkan penggunaan "~/"?
Kelas Uri
berisi cara sederhana untuk mengkonversi URL relatif ke URL absolut (diberikan URL absolut sebagai titik referensi untuk URL relatif):
var uri = new Uri(absoluteUrl, relativeUrl);
Jika relativeUrl
sebenarnya adalah URL abolute, maka absoluteUrl
diabaikan.
Satu-satunya pertanyaan yang tersisa adalah apa titik referensinya, dan apakah "~/" URL diperbolehkan (konstruktor Uri
tidak menerjemahkannya).
Masih belum ada yang cukup bagus menggunakan barang asli. Inilah yang akhirnya saya dapatkan:
public static string GetAbsoluteUrl(string url)
{
//VALIDATE INPUT
if (String.IsNullOrEmpty(url))
{
return String.Empty;
}
//VALIDATE INPUT FOR ALREADY ABSOLUTE URL
if (url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
{
return url;
}
//GET CONTEXT OF CURRENT USER
HttpContext context = HttpContext.Current;
//RESOLVE PATH FOR APPLICATION BEFORE PROCESSING
if (url.StartsWith("~/"))
{
url = (context.Handler as Page).ResolveUrl(url);
}
//BUILD AND RETURN ABSOLUTE URL
string port = (context.Request.Url.Port != 80 && context.Request.Url.Port != 443) ? ":" + context.Request.Url.Port : String.Empty;
return context.Request.Url.Scheme + Uri.SchemeDelimiter + context.Request.Url.Host + port + "/" + url.TrimStart('/');
}