.NET - Nhận giao thức, máy chủ và cổng


229

Có một cách đơn giản trong .NET để nhanh chóng có được giao thức, máy chủ và cổng hiện tại không? Ví dụ: nếu tôi vào URL sau:

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

Tôi cần trở về:

http://www.mywebsite.com:80

Tôi biết tôi có thể sử dụng Request.Url.AbsoluteUriđể có được URL hoàn chỉnh và tôi biết tôi có thể sử dụng Request.Url.Authorityđể lấy máy chủ và cổng, nhưng tôi không chắc chắn về cách tốt nhất để có được giao thức mà không cần phân tích chuỗi URL.

Bất kỳ đề xuất?


1
Xem câu trả lời của tôi cho câu hỏi simlar tại đây - stackoverflow.com/a/1534478/98740
WDuffy

Câu trả lời:


172

Mã (C #) sau đây nên thực hiện thủ thuật

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

26
Hoặc chuỗi được yêu cầu = uri.Scheme + Uri.SchemeD006iter + uri.Authority;
tranmq

17
Đây được cho là câu trả lời sai vì nó sẽ chèn ":" ngay cả khi không có cổng. Sử dụng Uri.GetLeftPartnhư @dthrasher chỉ ra
gman

Lưu ý rằng trong một số trường hợp, bạn vẫn muốn kết nối với uri. Bộ đọc ["Máy chủ"] thay vì GetLeftPart (), ví dụ: đằng sau proxy, dịch vụ của bạn có thể đang nghe trên một cổng khác / không chuẩn và nếu bạn sử dụng url đó trong một cuộc gọi lại (với cổng riêng) máy chủ sẽ không thể truy cập được.
doveryai

408

Mặc dù @Rick có câu trả lời được chấp nhận cho câu hỏi này, nhưng thực sự có một cách ngắn hơn để làm điều này, sử dụng Uri.GetLeftPart()phương pháp được đặt tên kém .

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

Có một cái để bắt GetLeftPart(), tuy nhiên. Nếu cổng là cổng mặc định cho sơ đồ, nó sẽ loại bỏ nó. Vì cổng 80 là cổng mặc định cho http, nên đầu ra GetLeftPart()trong ví dụ của tôi ở trên sẽ là http://www.mywebsite.com.

Nếu số cổng là thứ gì đó ngoài 80, thì nó sẽ được đưa vào kết quả.


12
Đây là ví dụ tốt nhất theo ý kiến ​​của tôi. Nó hoạt động cho localhost: port và live instance.
Người đàn ông Muffin

13
GetLeftPart - thực sự, OMG đặt tên đẹp.
Valentin Kuzub 18/03/2015

Có ai biết nếu phần này của url có một tên được sử dụng phổ biến không? Trong JavaScript, nó được gọi là Origin, nhưng tôi không chắc liệu điều đó có được mọi người đồng ý hay không: serverfault.com/questions/757494/ mẹo
Dirk Boer

1
Microsoft sử dụng thuật ngữ "Quyền hạn" cho việc này, nhưng tôi không biết liệu đó có phải là một thuật ngữ tiêu chuẩn hay không. Xem stackoverflow.com/questions/2142910/
trộm

1
Cá nhân tôi không thích sử dụng Urilớp học theo cách này. Có vô số trường hợp mà nhà xây dựng này sẽ đưa ra một ngoại lệ. Đối với hầu hết các trường hợp, tôi thích mã của mình sẽ dễ tha thứ hơn một chút trước khi hủy bỏ nhiệm vụ trong tay.
Jonathan Wood

60

Chà, nếu bạn đang làm điều này trong Asp.Net hoặc có quyền truy cập vào HTTPContext. Hiện tại, tôi muốn nói đây là những cách dễ dàng và tổng quát hơn để có được chúng:

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

Tôi hi vọng cái này giúp được. :)


1
Tôi thích phương pháp này, tôi chỉ có thể nhận được các mẫu mà tôi muốn và không phải lo lắng về việc chuỗi có được hình thành tốt hay không để có được cổng. 1
Jrud

Một số chi tiết khác về các thuộc tính này: blog.jonschneider.com/2014/10/ trên
Jon Schneider

33

Một cách có cấu trúc hơn để có được điều này là sử dụng UriBuilder. Điều này tránh thao tác chuỗi trực tiếp.

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

23

Request.Url sẽ trả lại cho bạn Uri của yêu cầu. Một khi bạn có được điều đó, bạn có thể lấy lại khá nhiều thứ bạn muốn. Để có được giao thức, hãy gọi thuộc tính Scheme .

Mẫu vật:

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

Hi vọng điêu nay co ich.


20

Thậm chí cách ngắn hơn, có thể yêu cầu ASP.Net mới hơn:

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

Enum UriComponents cho phép bạn chỉ định (các) thành phần nào của URI mà bạn muốn đưa vào.


1
Tuyệt vời, vì nó hoạt động trong PCL (.GetLeftPart () không có sẵn ở đó)
Sascha

10

Rất giống với câu trả lời của Holger. Nếu bạn cần lấy URL, có thể làm một cái gì đó như:

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

Lớp Uri cung cấp một loạt các phương thức, nhiều phương thức mà tôi chưa liệt kê.

Trong trường hợp của tôi, tôi cần phải nắm lấy LocalHostcùng Port Number, vì vậy đây là những gì tôi đã làm:

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

Mà lấy thành công: http://localhost:12345

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.