Bagaimana cara mendapatkan url lengkap dari halaman saya di C #

163

Saya harus bisa mendapatkan URL lengkap dari halaman yang saya aktifkan dari kontrol pengguna. Apakah ini hanya masalah menggabungkan sekelompok variabel Permintaan bersama? Kalau begitu yang mana? Atau ada cara yang lebih sederhana?

RedWolves
sumber
5
Kepada siapa pun di webfarm berbasis beban .. waspadalah nomor port yang muncul saat menggunakan System.Url: stackoverflow.com/questions/7674850/…
felickz

Jawaban:

155

Saya biasanya menggunakan Request.Url.ToString()untuk mendapatkan url lengkap (termasuk querystring), tidak diperlukan penggabungan.

travis
sumber
2
Jika URL berisi '#' maka semua karakter setelah # tidak akan dimasukkan.
Krunal Sisodiya
5
@KrunalSisodiya Saya tidak berpikir bahwa hash URL pernah dikirim ke server, tapi saya bisa saja salah.
travis
Request.Url.ToString()tidak termasuk queryString.
Yogesh Patel
320

Berikut adalah daftar yang biasanya saya rujuk untuk jenis informasi ini:

Request.ApplicationPath :   /virtual_dir
Request.CurrentExecutionFilePath :  /virtual_dir/webapp/page.aspx
Request.FilePath :  /virtual_dir/webapp/page.aspx
Request.Path :  /virtual_dir/webapp/page.aspx
Request.PhysicalApplicationPath :   d:\Inetpub\wwwroot\virtual_dir\
Request.QueryString :   /virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.AbsolutePath :  /virtual_dir/webapp/page.aspx
Request.Url.AbsoluteUri :   http://localhost:2000/virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.Host :  localhost
Request.Url.Authority : localhost:80
Request.Url.LocalPath : /virtual_dir/webapp/page.aspx
Request.Url.PathAndQuery :  /virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.Port :  80
Request.Url.Query : ?q=qvalue
Request.Url.Scheme :    http
Request.Url.Segments :  /
    virtual_dir/
    webapp/
    page.aspx

Semoga Anda akan menemukan ini berguna!

Mohsen
sumber
1
1) Ada juga Request.RawUrl; 2) Request.Url dapat memberikan pengecualian pada 'jalur yang diminta sangat buruk'.
user2864740
Jawaban yang sangat membantu, tetapi bukankah nomor port harus konsisten untuk menghindari kebingungan (dengan asumsi semua contoh adalah untuk permintaan yang sama? Mis. Otoritas dan Port menyiratkan port 80 tetapi AbsoluteUri berisi port 2000)
Young Bob
Request.QueryStringq=qvaluehanya mengembalikan
Marcel
74
Request.Url.AbsoluteUri

Properti ini melakukan semua yang Anda butuhkan, semua dalam satu panggilan singkat.

MengembangkanChris
sumber
6
+1. Ini jawaban terbaik. Harus lebih disukai daripada Request.Url.ToString ().
Todd Menier
10

Untuk itu ASP.NET CoreAnda harus mengejanya:

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")

Atau Anda dapat menambahkan pernyataan menggunakan ke tampilan Anda:

@using Microsoft.AspNetCore.Http.Extensions

kemudian

@Context.Request.GetDisplayUrl()

The _ViewImports.cshtmlmungkin tempat yang lebih baik untuk itu@using

Serj Sagan
sumber
1
Terima kasih. Ini membantu!
FlyingV
9

Permintaan.RawUrl

FlySwat
sumber
7
ini tidak mengembalikan url penuh. Jika url lengkapnya adalah blah.com/1.1/home/main?a=1 Request.RawUrl akan mengembalikan 1,1 / hom / main? A = 1
jnoreiga
9

jika Anda memerlukan URL lengkap sebagai segalanya mulai dari http hingga querystring, Anda harus menyatukan variabel-variabel berikut

Request.ServerVariables("HTTPS") // to check if it's HTTP or HTTPS
Request.ServerVariables("SERVER_NAME") 
Request.ServerVariables("SCRIPT_NAME") 
Request.ServerVariables("QUERY_STRING")
Christian Hagelid
sumber
2
Ini tidak memperhitungkan port non-standar (yaitu tidak menggunakan port 80 untuk http)
Spongeboy
1
Anda bisa menggunakan Request.ServerVariables ("SERVER_PORT") untuk deteksi port!
armen
1
Perhatikan bahwa jawaban ini menggunakan sintaks VB.Net. Dalam C #, gunakan Request.ServerVariables ["HTTPS"] misalnya.
jaycer
7

Lebih baik digunakan Request.Url.OriginalStringdaripada Request.Url.ToString()(menurut MSDN )

Eni
sumber
Hanya saja lebih baik jika Anda benar-benar membutuhkan string asli.
Dirk
@DirkThe dari tautan ke MSDN di atas: "String yang dikembalikan oleh metode ToString dapat berisi karakter kontrol, yang dapat merusak keadaan aplikasi konsol. Anda dapat menggunakan metode GetComponents dengan format UriFormat.SafeUnescaped untuk menghapus karakter kontrol dari string yang dikembalikan. . "
Eni
Tepat, dan itu tidak ada hubungannya dengan OriginalString.
Dirk
5

Terima kasih teman-teman, saya menggunakan kombinasi kedua jawaban Anda @Christian dan @Jonathan untuk kebutuhan spesifik saya.

"http://" + Request.ServerVariables["SERVER_NAME"] +  Request.RawUrl.ToString()

Saya tidak perlu khawatir tentang http aman, diperlukan variabel servername dan RawUrl menangani path dari nama domain dan termasuk querystring jika ada.

RedWolves
sumber
2
Anda juga harus tahu bahwa RawUrl, tidak seperti Request.Url, mewakili url permintaan asli yang belum dipetakan jika pemetaan url sedang digunakan.
harpo
SERVER_NAME sering tidak mengembalikan URL "asli" yang digunakan oleh klien. HTTP_HOST mungkin merupakan bentuk yang lebih baik jika akan menggali secara langsung .. juga melewatkan HTTP-to-another-port yang sederhana.
user2864740
1

Jika Anda memerlukan nomor port juga, Anda dapat menggunakan

Request.Url.Authority

Contoh:

string url = Request.Url.Authority + HttpContext.Current.Request.RawUrl.ToString();

if (Request.ServerVariables["HTTPS"] == "on")
{
    url = "https://" + url;
}
else 
{
    url = "http://" + url;
}
IonB
sumber
1

Coba yang berikut -

var FullUrl = Request.Url.AbsolutePath.ToString();
var ID = FullUrl.Split('/').Last();
Abhishek Kanrar
sumber