Bagaimana cara mendapatkan URI domain root di ASP.NET?

98

Katakanlah saya meng-hosting situs web di http://www.foobar.com .

Apakah ada cara agar saya secara terprogram dapat memastikan " http://www.foobar.com/ " dalam kode saya di belakang (yaitu tanpa harus melakukan hardcode di konfigurasi web saya)?

inti
sumber
7
Karena itu tergantung pada permintaan, Anda bisa mencoba mencari di Requestobjek.
John Saunders

Jawaban:

81

HttpContext.Current.Request.Url bisa memberi Anda semua info di URL. Dan dapat memecah url menjadi fragmennya.

JoshBerke
sumber
4
Ya, kenapa tidak memilih? Jangan melihat sesuatu yang ditandai sebagai jawaban -dan- sering ditolak. : /
Zack
4
Saya juga tidak suka jawaban ini. blesh telah memberikan yang benar dan ini seharusnya ditandai sebagai jawabannya ...
Michal
-1 - Request.Url sering memberikan url seperti "/ folder1 / folder2" dan mengecualikan domain sama sekali.
Justin
4
@Justin: Request.Url memberi Anda objek Uri yang memiliki semua bagian yang dipecah untuk Anda. Seharusnya tidak memberi Anda tali. Setidaknya tidak dalam versi .net yang saya gunakan
JoshBerke
6
Jawaban ini dapat ditingkatkan dengan menambahkan kode yang membuatnya berfungsi seperti jawaban di bawah ini yang memiliki suara lebih banyak ...
theJerm
172
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority);

Uri :: Metode GetLeftPart :

Metode GetLeftPart mengembalikan string yang berisi bagian paling kiri dari string URI, diakhiri dengan bagian yang ditentukan oleh bagian.

Penghitungan UriParsial :

Segmen skema dan otoritas URI.

George
sumber
5
Jauh lebih baik daripada mengurai Url!
Evgenyt
1
ini jawaban terbaik! tnx!
AminM
Ini harus menjadi jawaban yang dipilih. Terlalu banyak manipulasi string yang tidak diperlukan.
Ghasan
1
Dengan menggunakan metode ini, http: // www.lala.xxx/blah/blah akan mengembalikan http: // www.lala.xxx
live-love
+1 Dan tidak sama dengan Otoritas yang - dalam tes yang saya buat di localhost - meninggalkan bagian protokol (http: //).
GGleGrand
122

Bagi yang masih bertanya-tanya, jawaban yang lebih lengkap tersedia di http://devio.wordpress.com/2009/10/19/get-absolut-url-of-asp-net-application/ .

public string FullyQualifiedApplicationPath
{
    get
    {
        //Return variable declaration
        var appPath = string.Empty;

        //Getting the current context of HTTP request
        var context = HttpContext.Current;

        //Checking the current context content
        if (context != null)
        {
            //Formatting the fully qualified website url/name
            appPath = string.Format("{0}://{1}{2}{3}",
                                    context.Request.Url.Scheme,
                                    context.Request.Url.Host,
                                    context.Request.Url.Port == 80
                                        ? string.Empty
                                        : ":" + context.Request.Url.Port,
                                    context.Request.ApplicationPath);
        }

        if (!appPath.EndsWith("/"))
            appPath += "/";

        return appPath;
    }
}
Brian Hasden
sumber
4
Bekerja dengan sempurna. Jika situsnya adalah server: 8080 / MySiteName , itu mendapatkannya dengan benar.
Michael La Voie
2
Terima kasih telah membagikan kode sebenarnya alih-alih tautan di tempat lain.
theJerm
2
context.Request.Url.Port == 80 akan menyebabkan masalah dalam HTTPS
Evgenyt
7
Perhatian! Tidak berfungsi untuk https. Untuk https perlu mengganti context.Request.Url.Port == 80 dengan (context.Request.Url.Port == 80 && context.Request.Url.Scheme == "http") || (context.Request.Url.Port == 443 && context.Request.Url.Scheme == "https")atau menggunakan jawaban di bawah ini
razon
1
Bekerja juga untuk localhost (jika Anda menguji localy). Jika Anda tidak membutuhkan port, Anda dapat menggunakan "http: //" + HttpContext.Current.Request.Url.Host;
CyberHawk
34

Jika contoh Url adalah http://www.foobar.com/Page1

HttpContext.Current.Request.Url; //returns "http://www.foobar.com/Page1"


HttpContext.Current.Request.Url.Host; //returns "www.foobar.com"


HttpContext.Current.Request.Url.Scheme; //returns "http/https"


HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); //returns "http://www.foobar.com"
Dheeraj Palagiri
sumber
1
Tidak tidak. .Hostdari "http://www.foobar.com/Page1"adalah www.foobar.com, bukan foobar.com.
tchelidze
1
ya kamu benar, update jawabannya. @tchelidze thanks
Dheeraj Palagiri
27
string hostUrl = Request.Url.Scheme + "://" + Request.Url.Host; //should be "http://hostnamehere.com"
Ben Lesh
sumber
16

Untuk mendapatkan seluruh string URL permintaan:

HttpContext.Current.Request.Url

Untuk mendapatkan bagian permintaan www.foo.com:

HttpContext.Current.Request.Url.Host

Perhatikan bahwa Anda, pada tingkat tertentu, bergantung pada faktor-faktor di luar aplikasi ASP.NET Anda. Jika IIS dikonfigurasi untuk menerima beberapa atau setiap header host untuk aplikasi Anda, maka salah satu domain yang diselesaikan ke aplikasi Anda melalui DNS dapat muncul sebagai Url Permintaan, bergantung pada yang mana yang dimasukkan pengguna.

Rex M
sumber
1
solusi paling sederhana di sini
full_prog_full
4
Match match = Regex.Match(host, "([^.]+\\.[^.]{1,3}(\\.[^.]{1,3})?)$");
string domain = match.Groups[1].Success ? match.Groups[1].Value : null;

host.com => kembalikan host.com
s.host.com => kembalikan host.com

host.co.uk => return host.co.uk
www.host.co.uk => return host.co.uk
s1.www.host.co.uk => return host.co.uk

NQuenault
sumber
Saya menyadari ini adalah posting lama, tetapi dilakukan dengan baik NQuenault, saya tidak hebat dalam Ekspresi Regex, dilakukan dengan sangat baik. Persis yang saya butuhkan.
JeffreyJ
@nquenault ada pemikiran tentang cara terbaik menangani nama host seperti www.abc.com? Terima kasih!
Gary Ewan Park
4

--Menambahkan port dapat membantu saat menjalankan IIS Express

Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port
JonathanC
sumber
3
string domainName = Request.Url.Host
Sk93
sumber
3

Saya tahu ini lebih tua tetapi cara yang benar untuk melakukan ini sekarang adalah

string Domain = HttpContext.Current.Request.Url.Authority

Itu akan mendapatkan DNS atau alamat ip dengan port untuk server.

idlehands23
sumber
3

Ini juga berfungsi:

string url = HttpContext.Request.Url.Authority;

Fribu - Solusi Cerdas
sumber
1

C # Contoh Di Bawah:

string scheme = "http://";
string rootUrl = default(string);
if (Request.ServerVariables["HTTPS"].ToString().ToLower() == "on")
{
  scheme = "https://";
}
rootUrl = scheme + Request.ServerVariables["SERVER_NAME"].ToString();
Saul Dolgin
sumber
1
string host = Request.Url.Host;
Regex domainReg = new Regex("([^.]+\\.[^.]+)$");
HttpCookie cookie = new HttpCookie(cookieName, "true");
if (domainReg.IsMatch(host))
{
  cookieDomain = domainReg.Match(host).Groups[1].Value;                                
}
Shawn Constance
sumber
1

Ini akan mengembalikan secara spesifik apa yang Anda minta.

Dim mySiteUrl = Request.Url.Host.ToString()

Saya tahu ini pertanyaan lama. Tapi saya membutuhkan jawaban sederhana yang sama dan ini mengembalikan persis apa yang diminta (tanpa http: //).

tomepenn.dll
sumber