ฉันจะรับ URL แบบเต็มของหน้าเว็บที่ฉันใช้ใน C # ได้อย่างไร


163

ฉันต้องสามารถใช้ URL แบบเต็มของหน้าเว็บที่ฉันใช้จากการควบคุมของผู้ใช้ มันเป็นเพียงเรื่องของการเชื่อมโยงตัวแปร Request เข้าด้วยกันเป็นกลุ่มหรือไม่? ถ้าเป็นเช่นนั้น หรือมีวิธี simpiler มากกว่าหรือไม่


6
สำหรับทุกคนในเว็บโหลดบาลานซ์ .. ระวังหมายเลขพอร์ตที่ปรากฏเมื่อใช้ System.Url: stackoverflow.com/questions/7674850/…
felickz

คำตอบ:


155

ฉันมักจะใช้Request.Url.ToString()เพื่อให้ได้ URL แบบเต็ม (รวมถึงการสืบค้น) โดยไม่ต้องต่อข้อมูล


2
หาก URL มี '#' ดังนั้นอักขระทั้งหมดที่อยู่หลัง # จะไม่รวมอยู่ด้วย
Krunal Sisodiya

5
@KrunalSisodiya ฉันไม่คิดว่าแฮชของ URL ถูกส่งไปยังเซิร์ฟเวอร์ แต่ฉันอาจจะผิด
travis

1
Request.Url.ToString()ไม่รวม queryString
Yogesh Patel

320

นี่คือรายการที่ฉันมักจะอ้างถึงสำหรับข้อมูลประเภทนี้:

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

หวังว่าคุณจะพบว่ามีประโยชน์นี้!


1
1) นอกจากนี้ยังมี Request.RawUrl; 2) Request.Url อาจมีข้อยกเว้นใน 'เส้นทางที่ร้องขอไม่ดีมาก'
2864740

คำตอบที่เป็นประโยชน์มาก แต่หมายเลขพอร์ตไม่ควรสอดคล้องเพื่อหลีกเลี่ยงความสับสน (สมมติว่าตัวอย่างทั้งหมดมีไว้สำหรับคำขอเดียวกันเช่น Authority และ Port บอกถึงพอร์ต 80 แต่ AbsoluteUri มีพอร์ต 2000)
Young Bob

Request.QueryStringส่งคืนq=qvalueเท่านั้น
Marcel

74
Request.Url.AbsoluteUri

สถานที่ให้บริการนี้ทำทุกสิ่งที่คุณต้องการในการโทรสั้น ๆ


6
+1 นี่คือคำตอบที่ดีที่สุด ควรเป็นที่ต้องการมากกว่า Request.Url.ToString ()
Todd Menier

10

สำหรับASP.NET Coreคุณจะต้องสะกดมันออกมา:

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

หรือคุณสามารถเพิ่มคำสั่งที่ใช้ในมุมมองของคุณ:

@using Microsoft.AspNetCore.Http.Extensions

แล้วก็

@Context.Request.GetDisplayUrl()

_ViewImports.cshtmlอาจจะเป็นสถานที่ที่ดีสำหรับการที่@using


1
ขอบคุณ สิ่งนี้ช่วย!
FlyingV


9

หากคุณต้องการ URL แบบเต็มทุกอย่างจาก http ไปยังการสอบถามคุณจะต้องเชื่อมต่อตัวแปรต่อไปนี้

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

2
สิ่งนี้ไม่ได้คำนึงถึงพอร์ตที่ไม่ได้มาตรฐาน (เช่นไม่ใช้พอร์ต 80 สำหรับ http)
Spongeboy

1
คุณสามารถใช้ Request.ServerVariables ("SERVER_PORT") เพื่อตรวจจับพอร์ต!
armen

1
โปรดทราบว่าคำตอบนี้ใช้ไวยากรณ์ VB.Net ใน C # ให้ใช้ Request.ServerVariables ["HTTPS"] เช่น
jaycer

7

ดีกว่าที่จะใช้Request.Url.OriginalStringกว่าRequest.Url.ToString()(ตามMSDN )


มันจะดีกว่าถ้าคุณต้องการสตริงเดิม
เดิร์ค

@DirkThe จากลิงก์ไปยัง MSDN ด้านบน: "String ที่ส่งคืนโดยเมธอด ToString อาจมีอักขระควบคุมซึ่งอาจทำให้สถานะของแอปพลิเคชันคอนโซลเสียหายได้คุณสามารถใช้วิธี GetComponents ด้วยรูปแบบ UriFormat.SafeUnescnes เพื่อเอาอักขระควบคุมออกจากสตริงที่ส่งคืน ."
Eni

OriginalStringแน่นอนและที่มีอะไรจะทำอย่างไรกับ
Dirk

5

ขอบคุณพวกฉันใช้ทั้งคำตอบของคุณ @Christian และ @Jonathan สำหรับความต้องการเฉพาะของฉัน

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

ฉันไม่ต้องกังวลเกี่ยวกับ http ที่ปลอดภัยจำเป็นต้องใช้ตัวแปรชื่อเซิร์ฟเวอร์และ RawUrl จัดการเส้นทางจากชื่อโดเมนและรวมถึงการสอบถามถ้ามี


2
คุณควรทราบว่า RawUrl ซึ่งแตกต่างจาก Request.Url แสดงถึง url คำขอที่ไม่ได้ถูกแมปดั้งเดิมหากใช้การแมป url
harpo

SERVER_NAME มักจะไม่ส่งคืน URL "ของจริง" ที่ลูกค้าใช้ HTTP_HOST น่าจะเป็นรูปแบบที่ดีกว่าถ้าไปขุดโดยตรง .. และยังขาด HTTP-to-another-port ธรรมดา
2864740

1

หากคุณต้องการหมายเลขพอร์ตคุณสามารถใช้

Request.Url.Authority

ตัวอย่าง:

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.