2008-09-02 31 views
128

Tôi cần có thể truy cập URL đầy đủ của trang tôi đang truy cập từ điều khiển người dùng. Nó chỉ là vấn đề ghép nối một loạt các biến Yêu cầu với nhau? Nếu vậy thì cái nào? Hoặc là có một cách simpiler hơn?Làm cách nào để nhận được url đầy đủ của trang tôi đang ở trong C#

+4

Để bất cứ ai trong một webfarm loadbalanced .. hãy cẩn thận số cổng xuất hiện khi sử dụng System.Url: http://stackoverflow.com/questions/7674850/get -original-url-without-non-standard-port-c – felickz

Trả lời

133

Tôi thường sử dụng Request.Url.ToString() để nhận được url đầy đủ (bao gồm cả chuỗi truy vấn), không cần ghép nối.

+2

Nếu URL chứa '#' thì tất cả ký tự sau # sẽ không được bao gồm. –

+5

@KrunalSisodiya Tôi không nghĩ rằng băm của URL được gửi đến máy chủ, nhưng tôi có thể sai. – travis

+0

'Request.Url.ToString()' không bao gồm queryString. –

9

Request.RawUrl

+7

điều này không trả lại url đầy đủ. Nếu url đầy đủ là http://www.blah.com/1.1/home/main?a=1 Yêu cầu.RawUrl sẽ trả về 1.1/hom/main? A = 1 – jnoreiga

9

nếu bạn cần URL đầy đủ như tất cả mọi thứ từ http đến chuỗi truy vấn, bạn sẽ cần phải nối các biến sau

Request.ServerVariables("HTTPS") // to check if it's HTTP or HTTPS 
Request.ServerVariables("SERVER_NAME") 
Request.ServerVariables("SCRIPT_NAME") 
Request.ServerVariables("QUERY_STRING") 
+2

Điều này không tính đến các cổng không chuẩn (tức là không sử dụng cổng 80 cho http) – Spongeboy

+1

bạn có thể sử dụng Request.ServerVariables ("SERVER_PORT") để phát hiện cổng! – armen

+1

Lưu ý rằng câu trả lời này sử dụng cú pháp VB.Net. Trong C#, hãy sử dụng Request.ServerVariables ["HTTPS"] chẳng hạn. – jaycer

4

Thanks guys, tôi đã sử dụng một sự kết hợp của cả hai bạn câu trả lời @Christian và @Jonathan cho nhu cầu cụ thể của tôi.

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

Tôi không cần lo lắng về bảo mật http, cần biến servername và RawUrl xử lý đường dẫn từ tên miền và bao gồm chuỗi truy vấn nếu có.

+2

Bạn cũng nên biết rằng RawUrl, không giống như Yêu cầu.Url, đại diện cho url yêu cầu ban đầu, chưa được ánh xạ nếu ánh xạ url đang được sử dụng. – harpo

+0

SERVER_NAME thường không trả về URL "thực" do khách hàng sử dụng. HTTP_HOST có lẽ là hình thức tốt hơn nếu đi đào sâu trực tiếp .. cũng bỏ qua HTTP-to-another-port đơn giản. – user2864740

62
Request.Url.AbsoluteUri 

Thuộc tính này làm mọi thứ bạn cần, tất cả trong một cuộc gọi nhậy cảm.

+6

+1. Đây là câu trả lời hay nhất. Nên được ưa thích hơn Request.Url.ToString(). –

+0

* succint * ...... – Unbreakable

1

Nếu bạn cần số cổng cũng có, bạn có thể sử dụng

Request.Url.Authority 

Ví dụ:

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

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

Dưới đây là danh sách tôi thường tham khảo cho loại thông tin này:

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 

Hy vọng rằng bạn sẽ thấy điều này hữu ích!

+0

1) Ngoài ra còn có Request.RawUrl; 2) Request.Url có thể ném một ngoại lệ trên 'đường dẫn yêu cầu rất xấu'. – user2864740

+0

Câu trả lời rất hữu ích, nhưng không nên số cổng nhất quán để tránh nhầm lẫn (giả sử tất cả các ví dụ là cho cùng một yêu cầu? Ví dụ, Authority và Port ngụ ý cổng 80 nhưng AbsoluteUri chứa cổng 2000) –

+0

'Request.QueryString' trả về' q = qvalue' chỉ – Marcel

5

Tốt hơn để sử dụng Request.Url.OriginalString hơn Request.Url.ToString() (theo MSDN)

+0

Nó chỉ tốt hơn nếu bạn thực sự yêu cầu chuỗi gốc. – Dirk

+0

@DirkTừ liên kết đến MSDN ở trên: "Chuỗi được trả về bởi phương thức ToString có thể chứa các ký tự điều khiển, có thể làm hỏng trạng thái của ứng dụng bảng điều khiển. Bạn có thể sử dụng phương thức GetComponents với định dạng UriFormat.SafeUnescaped để loại bỏ các ký tự điều khiển khỏi chuỗi." – Eni

+0

Chính xác và không liên quan gì đến 'OriginalString'. – Dirk

1

Đối ASP.NET Core bạn sẽ cần phải đánh vần nó ra:

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

Hoặc bạn có thể thêm một tuyên bố sử dụng để xem của bạn:

@using Microsoft.AspNetCore.Http.Extensions 

sau đó

@Context.Request.GetDisplayUrl() 

Các _ViewImports.cshtml có thể là một nơi tốt đẹp hơn cho rằng @using

Các vấn đề liên quan