.NET - รับโปรโตคอลโฮสต์และพอร์ต


228

มีวิธีง่ายๆใน. NET เพื่อรับโปรโตคอลปัจจุบันโฮสต์และพอร์ตอย่างรวดเร็วหรือไม่ ตัวอย่างเช่นถ้าฉันอยู่ใน URL ต่อไปนี้:

http://www.mywebsite.com:80/pages/page1.aspx

ฉันต้องการส่งคืน:

http://www.mywebsite.com:80

ฉันรู้ว่าฉันสามารถใช้Request.Url.AbsoluteUriเพื่อรับ URL ที่สมบูรณ์และฉันรู้ว่าฉันสามารถใช้Request.Url.Authorityเพื่อรับโฮสต์และพอร์ต แต่ฉันไม่แน่ใจเกี่ยวกับวิธีที่ดีที่สุดในการรับโปรโตคอลโดยไม่ต้องแยกวิเคราะห์สตริง URL

ข้อเสนอแนะใด ๆ


1
ดูคำตอบของฉันสำหรับคำถามซิมลาร์ได้ที่นี่ - stackoverflow.com/a/1534478/98740
WDuffy

คำตอบ:


172

รหัส (C #) ต่อไปนี้ควรทำเคล็ดลับ

Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;

26
หรือสตริงที่ร้องขอ = uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
tranmq

17
นี่เป็นคำตอบที่ผิดเนื่องจากจะแทรก ":" แม้ว่าจะไม่มีพอร์ต ใช้Uri.GetLeftPartเป็น @dthrasher คะแนน
gman

โปรดทราบว่าในบางกรณีคุณยังคงต้องการเชื่อมต่อกับ uri.Headers ["Host"] แทน GetLeftPart () เช่นหลังพร็อกซีบริการของคุณอาจฟังบนพอร์ตอื่น / ไม่ใช่มาตรฐานและหากคุณใช้ URL นั้นใน โทรกลับ (ด้วยพอร์ตส่วนตัว) โฮสต์จะไม่สามารถเข้าถึงได้
doveryai

408

แม้ว่า @Rick จะมีคำตอบที่ยอมรับได้สำหรับคำถามนี้ แต่ก็มีวิธีที่สั้นกว่าในการทำเช่นนี้โดยใช้Uri.GetLeftPart()วิธีที่มีชื่อไม่ดี

Uri url = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string output = url.GetLeftPart(UriPartial.Authority);

มีหนึ่งที่จับไปGetLeftPart()เป็นอย่างไรก็ตาม หากพอร์ตเป็นพอร์ตเริ่มต้นสำหรับโครงร่างพอร์ตจะตัดออก เนื่องจากพอร์ต 80 เป็นพอร์ตเริ่มต้นสำหรับ http ผลลัพธ์ของGetLeftPart()ในตัวอย่างของฉันด้านบนจะเป็นhttp://www.mywebsite.comในตัวอย่างของฉันข้างต้นจะเป็น

หากหมายเลขพอร์ตเป็นอย่างอื่นที่ไม่ใช่ 80 จะรวมอยู่ในผลลัพธ์


12
นี่เป็นตัวอย่างที่ดีที่สุดในความคิดของฉัน มันทำงานได้กับ localhost: พอร์ตและอินสแตนซ์สด
มัฟฟินแมน

13
GetLeftPart - จริง ๆ แล้วการตั้งชื่อที่ดี OMG
Valentin Kuzub

ไม่มีใครรู้ว่าส่วนนี้ของ url มีชื่อที่ใช้กันทั่วไปหรือไม่? ใน JavaScript เรียกว่า Origin แต่ฉันไม่แน่ใจว่ามีการตกลงร่วมกันในระดับสากลหรือไม่: serverfault.com/questions/757494/ …
Dirk Boer

1
Microsoft ใช้คำว่า "สิทธิ์" สำหรับสิ่งนี้ แต่ฉันไม่รู้ว่าเป็นคำมาตรฐานหรือไม่ ดูstackoverflow.com/questions/2142910/…
dthrasher

1
โดยส่วนตัวฉันไม่ชอบใช้Uriชั้นเรียนด้วยวิธีนี้ มีหลายกรณีที่ผู้สร้างนี้จะโยนข้อยกเว้น สำหรับกรณีส่วนใหญ่ฉันต้องการรหัสของฉันที่จะให้อภัยมากขึ้นเล็กน้อยก่อนที่จะยกเลิกงานในมือ
โจนาธานวู้ด

60

ดีถ้าคุณทำเช่นนี้ใน Asp.Net หรือมีการเข้าถึง HttpContext.Current.Request ฉันจะบอกว่าสิ่งเหล่านี้ง่ายกว่าและเป็นวิธีทั่วไปในการทำให้พวกเขา:

var scheme = Request.Url.Scheme; // will get http, https, etc.
var host = Request.Url.Host; // will get www.mywebsite.com
var port = Request.Url.Port; // will get the port
var path = Request.Url.AbsolutePath; // should get the /pages/page1.aspx part, can't remember if it only get pages/page1.aspx

ฉันหวังว่านี่จะช่วยได้. :)


1
ฉันชอบวิธีนี้ฉันจะได้รับเพียงชิ้นที่ฉันต้องการและไม่ต้องกังวลว่าสตริงนั้นจะเกิดขึ้นดีพอที่จะรับพอร์ตหรือไม่ 1
Jrud

รายละเอียดเพิ่มเติมเกี่ยวกับคุณสมบัติเหล่านี้: blog.jonschneider.com/2014/10/…
Jon Schneider

33

วิธีที่มีโครงสร้างมากขึ้นในการรับสิ่งนี้คือการใช้ UriBuilder วิธีนี้จะหลีกเลี่ยงการจัดการสตริงโดยตรง

var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);

23

Request.Url จะส่งคืนUriที่คุณขอ เมื่อคุณมีสิ่งนั้นแล้วคุณสามารถเรียกคืนทุกอย่างที่คุณต้องการ หากต้องการรับโปรโตคอลให้โทรไปที่คุณสมบัติของโครงการ

ตัวอย่าง:

Uri url = Request.Url;
string protocol = url.Scheme;

หวังว่านี่จะช่วยได้


20

แม้แต่วิธีที่สั้นกว่าอาจต้องการ ASP.Net ที่ใหม่กว่า:

string authority = Request.Url.GetComponents(UriComponents.SchemeAndServer,UriFormat.Unescaped)

UriComponents enum ช่วยให้คุณระบุองค์ประกอบของ URI ที่คุณต้องการรวม


1
เยี่ยมมากเพราะใช้งานได้ใน PCL (.GetLeftPart () ไม่สามารถใช้งานได้)
Sascha

10

คล้ายกับคำตอบของโฮลเกอร์ หากคุณต้องการคว้า URL สามารถทำสิ่งต่อไปนี้:

Uri uri = Context.Request.Url;         
var scheme = uri.Scheme // returns http, https
var scheme2 = uri.Scheme + Uri.SchemeDelimiter; // returns http://, https://
var host = uri.Host; // return www.mywebsite.com
var port = uri.Port; // returns port number

ระดับ Uriให้ทั้งช่วงของวิธีการหลายอย่างที่ผมยังไม่ได้จดทะเบียน

ในตัวอย่างของฉันฉันต้องคว้าLocalHostพร้อมกับPort Numberดังนั้นนี่คือสิ่งที่ฉันทำ:

var Uri uri = Context.Request.Url;
var host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port; 

ซึ่งคว้าสำเร็จ: http://localhost:12345

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