Dapatkan URL Absolut dari jalur Relatif (metode refactored)

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).

Komentar (0)

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('/');
}
Komentar (0)

periksa kode berikut untuk mengambil Url absolut:

Page.Request.Url.AbsoluteUri

Semoga bermanfaat.

Komentar (0)