Làm cách nào để lấy URI miền gốc trong ASP.NET?


96

Giả sử tôi đang lưu trữ một trang web tại http://www.foobar.com .

Có cách nào để tôi có thể lập trình xác định " http://www.foobar.com/ " trong mã phía sau của mình (tức là mà không cần phải mã hóa nó trong cấu hình web của tôi) không?


7
Vì điều đó phụ thuộc vào yêu cầu, bạn có thể thử tìm kiếm trong Requestđối tượng.
John Saunders,

Câu trả lời:


79

HttpContext.Current.Request.Url có thể cung cấp cho bạn tất cả thông tin trên URL. Và có thể chia nhỏ url thành các mảnh của nó.


4
Vâng, tại sao lại bỏ phiếu? Đừng thấy điều gì đó được đánh dấu là câu trả lời - và thường xuyên phản đối. : /
Zack

4
Tôi cũng không thích câu trả lời này. blesh đã đưa ra câu trả lời đúng và điều này lẽ ra phải được đánh dấu là câu trả lời ...
Michal B.

-1 - Request.Url thường cung cấp một url chẳng hạn như "/ folder1 / folder2" và loại trừ hoàn toàn miền.
Justin

4
@Justin: Request.Url cung cấp cho bạn một đối tượng Uri có tất cả các phần được chia nhỏ cho bạn. Nó không nên cung cấp cho bạn một chuỗi. Ít nhất thì không có trong phiên bản .net mà tôi đang sử dụng
JoshBerke

6
Câu trả lời này có thể được cải thiện bằng cách thêm mã làm cho nó hoạt động giống như câu trả lời bên dưới có nhiều phiếu bầu hơn ...
theJerm

171
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority);

Phương pháp Uri :: GetLeftPart :

Phương thức GetLeftPart trả về một chuỗi chứa phần ngoài cùng bên trái của chuỗi URI, kết thúc bằng phần được chỉ định bởi một phần.

Liệt kê một phần tiểu :

Lược đồ và phân đoạn quyền hạn của URI.


5
Tốt hơn nhiều sau đó phân tích cú pháp Url!
Evgenyt

1
đây là câu trả lời tốt nhất! tnx!
AminM

Đây sẽ là câu trả lời được chọn. Quá nhiều thao tác chuỗi không cần thiết.
Ghasan

1
Sử dụng phương pháp này, http: // www.lala.xxx/blah/blah sẽ trả về http: // www.lala.xxx
live-love

+1 Và không giống với .Authority - trong các thử nghiệm tôi đã thực hiện trên localhost - bỏ qua phần giao thức (http: //).
GGleGrand

122

Đối với bất kỳ ai còn thắc mắc, câu trả lời đầy đủ hơn có tại http://devio.wordpress.com/2009/10/19/get-absolut-url-of-asp-net-application/ .

public string FullyQualifiedApplicationPath
{
    get
    {
        //Return variable declaration
        var appPath = string.Empty;

        //Getting the current context of HTTP request
        var context = HttpContext.Current;

        //Checking the current context content
        if (context != null)
        {
            //Formatting the fully qualified website url/name
            appPath = string.Format("{0}://{1}{2}{3}",
                                    context.Request.Url.Scheme,
                                    context.Request.Url.Host,
                                    context.Request.Url.Port == 80
                                        ? string.Empty
                                        : ":" + context.Request.Url.Port,
                                    context.Request.ApplicationPath);
        }

        if (!appPath.EndsWith("/"))
            appPath += "/";

        return appPath;
    }
}

4
Hoạt động hoàn hảo. Nếu trang web là máy chủ: 8080 / MySiteName , nó sẽ nhận đúng.
Michael La Voie

2
Cảm ơn bạn đã chia sẻ mã thực tế thay vì một liên kết ở một nơi khác.
theJerm

2
context.Request.Url.Port == 80 sẽ gây ra sự cố trong HTTPS
Evgenyt

7
Chú ý! Không hoạt động cho https. Đối với https cần thay thế context.Request.Url.Port == 80 bằng (context.Request.Url.Port == 80 && context.Request.Url.Scheme == "http") || (context.Request.Url.Port == 443 && context.Request.Url.Scheme == "https")hoặc sử dụng câu trả lời bên dưới
razon 22/09/2016

1
Cũng hoạt động cho localhost (nếu bạn đang thử nghiệm localy). Nếu bạn không cần cổng, bạn có thể sử dụng "http: //" + HttpContext.Current.Request.Url.Host;
CyberHawk

32

Nếu Url ví dụ là http://www.foobar.com/Page1

HttpContext.Current.Request.Url; //returns "http://www.foobar.com/Page1"


HttpContext.Current.Request.Url.Host; //returns "www.foobar.com"


HttpContext.Current.Request.Url.Scheme; //returns "http/https"


HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); //returns "http://www.foobar.com"

1
Không không. .Hostcủa "http://www.foobar.com/Page1"www.foobar.com, không phải foobar.com.
tchelidze 13/02/19

1
có bạn đúng, đã cập nhật câu trả lời. @tchelidze cảm ơn
Dheeraj Palagiri

27
string hostUrl = Request.Url.Scheme + "://" + Request.Url.Host; //should be "http://hostnamehere.com"

16

Để nhận toàn bộ chuỗi URL yêu cầu:

HttpContext.Current.Request.Url

Để nhận phần www.foo.com của yêu cầu:

HttpContext.Current.Request.Url.Host

Lưu ý rằng bạn, ở một mức độ nào đó, phụ thuộc vào các yếu tố bên ngoài ứng dụng ASP.NET của bạn. Nếu IIS được định cấu hình để chấp nhận nhiều hoặc bất kỳ tiêu đề máy chủ nào cho ứng dụng của bạn, thì bất kỳ miền nào trong số đó được phân giải cho ứng dụng của bạn qua DNS có thể hiển thị dưới dạng Url yêu cầu, tùy thuộc vào tên miền mà người dùng đã nhập.


1
Giải pháp đơn giản nhất đây
full_prog_full

4
Match match = Regex.Match(host, "([^.]+\\.[^.]{1,3}(\\.[^.]{1,3})?)$");
string domain = match.Groups[1].Success ? match.Groups[1].Value : null;

host.com => trả về host.com
s.host.com => trả về host.com

host.co.uk => trả về host.co.uk
www.host.co.uk => trả về host.co.uk
s1.www.host.co.uk => trả về host.co.uk


Tôi nhận ra rằng đây là một bài viết cũ, nhưng NQuenault được thực hiện rất tốt, tôi không giỏi Regex Expressions được thực hiện tốt như vậy. Chính xác những gì tôi cần.
JeffreyJ

@nquenault có bất kỳ suy nghĩ nào về cách tốt nhất để xử lý tên máy chủ lưu trữ như www.abc.com không? Cảm ơn!
Gary Ewan Park

4

- Thêm cổng có thể hữu ích khi chạy IIS Express

Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port


3

Tôi biết điều này đã cũ hơn nhưng cách chính xác để làm điều này bây giờ là

string Domain = HttpContext.Current.Request.Url.Authority

Điều đó sẽ nhận được DNS hoặc địa chỉ ip có cổng cho máy chủ.



1

Ví dụ C # Dưới đây:

string scheme = "http://";
string rootUrl = default(string);
if (Request.ServerVariables["HTTPS"].ToString().ToLower() == "on")
{
  scheme = "https://";
}
rootUrl = scheme + Request.ServerVariables["SERVER_NAME"].ToString();

1
string host = Request.Url.Host;
Regex domainReg = new Regex("([^.]+\\.[^.]+)$");
HttpCookie cookie = new HttpCookie(cookieName, "true");
if (domainReg.IsMatch(host))
{
  cookieDomain = domainReg.Match(host).Groups[1].Value;                                
}

1

Điều này sẽ trả về cụ thể những gì bạn đang yêu cầu.

Dim mySiteUrl = Request.Url.Host.ToString()

Tôi biết đây là một câu hỏi cũ hơn. Nhưng tôi cần câu trả lời đơn giản tương tự và điều này trả về chính xác những gì được hỏi (không có http: //).

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.