Cách lấy tên miền hiện tại trong ASP.NET


82

Tôi muốn lấy tên miền hiện tại trong asp.net c #.

Tôi đang sử dụng mã này.

string DomainName = HttpContext.Current.Request.Url.Host;

URL của tôi là localhost:5858nhưng nó chỉ trả về localhost.

Bây giờ, tôi đang sử dụng dự án của mình trong localhost. Tôi muốn tải localhost: 5858.

Ví dụ khác, khi tôi đang sử dụng miền này

www.somedomainname.com

tôi muốn lấy somedomainname.com

Xin vui lòng cho tôi một ý tưởng làm thế nào để có được tên miền hiện tại.


1
Tên máy chủ và tên miền là 2 thứ khác nhau. Bạn có muốn một miền được ánh xạ tới địa chỉ IP cụ thể của bạn hoặc tên máy chủ của máy chạy trên đó không?
— Rob Goodwin


var base_url = "@ Request.Url.GetLeftPart (UriPartial.Authority) @ Url.Content (" ~ / ")"
— Prince Prasad,

Câu trả lời:


75

Sử dụng Request.Url.Hostlà thích hợp - đó là cách bạn truy xuất giá trị của Host:tiêu đề HTTP , chỉ định tên máy chủ (tên miền) mà UA (trình duyệt) muốn, vì phần Đường dẫn tài nguyên của yêu cầu HTTP không bao gồm tên máy chủ.

Lưu ý rằng đó localhost:5858không phải là một tên miền, nó là một chỉ định điểm cuối, còn được gọi là "quyền hạn", bao gồm tên máy chủ và số cổng TCP. Điều này được lấy ra bằng cách truy cập Request.Uri.Authority.

Hơn nữa, nó không hợp lệ để lấy somedomain.comtừ www.somedomain.comvì một máy chủ web có thể được định cấu hình để phục vụ một trang khác www.somedomain.comso với somedomain.com, tuy nhiên nếu bạn chắc chắn điều này hợp lệ trong trường hợp của mình thì bạn sẽ cần phải phân tích cú pháp thủ công tên máy chủ, mặc dù việc sử dụng String.Split('.')hoạt một nhúm.

Lưu ý rằng cấu hình máy chủ web (IIS) khác với cấu hình của ASP.NET và ASP.NET thực sự hoàn toàn không biết về cấu hình liên kết HTTP của các trang web và ứng dụng web mà nó chạy dưới đó. Thực tế là cả IIS và ASP.NET đều chia sẻ các tệp cấu hình giống nhau ( web.config) là một red-herring.


112

Hãy thử lấy "phần bên trái" của url, như sau:

string domainName = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);

Điều này sẽ cung cấp cho bạn http://localhost:5858hoặc https://www.somedomainname.comcho dù bạn đang sử dụng địa phương hay sản xuất. Nếu bạn muốn bỏ wwwphần này, bạn nên cấu hình IIS để làm như vậy, nhưng đó là một chủ đề khác.

Xin lưu ý rằng URL kết quả sẽ không có dấu gạch chéo.


7
Đây nên là câu trả lời tốt nhất theo ý kiến ​​của tôi.
— Andrew

Điều này hoạt động tuyệt vời cho nhu cầu của tôi. Tuy nhiên, có một điều chỉnh nhỏ: khi yêu cầu phần Authority, chuỗi trả về sẽ không bao gồm dấu phân cách đường dẫn. Như vậy:http://localhost:60333
— Will

1
var base_url = "@ Request.Url.GetLeftPart (UriPartial.Authority) @ Url.Content (" ~ / ")"
— Prince Prasad,

Điều này dường như không hoạt động trên Asp.Net Core 2.2. Tôi nhận được 'HttpContext' không chứa định nghĩa cho 'Hiện tại' và không có phương thức mở rộng nào có thể truy cập được 'Hiện tại' chấp nhận đối số đầu tiên thuộc loại 'HttpContext' (bạn có thiếu một chỉ thị using hay tham chiếu hợp ngữ không?).
— Stian

@Stian Rõ ràng có một bài đăng khác đã trả lời rằng: stackoverflow.com/questions/31243068/… . Câu trả lời này chỉ tập trung vào phần URI.
— Arturo Torres Sánchez

39

Đây là ảnh chụp màn hình Request.RequestUrivà tất cả các thuộc tính của nó để mọi người tham khảo.

nhập mô tả hình ảnh ở đây


18

Bạn có thể thử mã sau:

 Request.Url.Host +
    (Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port)

6

www.somedomain.com là miền / máy chủ. Miền phụ là một phần quan trọng. www.thường được sử dụng thay thế cho nhau với việc không có, nhưng điều đó phải được thiết lập như một quy tắc (ngay cả khi nó được đặt theo mặc định) vì chúng không tương đương. Hãy nghĩ về một miền phụ khác, như mx.. Đó có thể có một mục tiêu khác với www..

Vì vậy, tôi khuyên bạn không nên làm những việc như thế này. Điều đó nói rằng, vì bạn đang hỏi tôi tưởng tượng bạn có lý do chính đáng.

Cá nhân, tôi muốn đề xuất cách viết hoa đặc biệt www.cho điều này.

string host = HttpContext.Current.Request.Url.GetComponents(UriComponents.HostAndPort, UriFormat.Unescaped);;

if (host.StartsWith("www."))
    return host.Substring(4);
else
    return host;

Ngược lại, nếu bạn thực sự chắc chắn 100% rằng bạn muốn loại bỏ bất kỳ tên miền phụ nào , bạn sẽ cần một cái gì đó phức tạp hơn một chút.

string host = ...;

int lastDot = host.LastIndexOf('.');

int secondToLastDot = host.Substring(0, lastDot).LastIndexOf('.');

if (secondToLastDot > -1)
    return host.Substring(secondToLastDot + 1);
else
    return host;

Bắt được cảng giống như những người khác đã nói.


1

HttpContext.Current.Request.Url.Host đang trả về các giá trị chính xác. Nếu bạn chạy nó trên www.somedomainname.com, nó sẽ cung cấp cho bạn www.somedomainname.com. Nếu bạn muốn có được 5858, bạn cần sử dụng

HttpContext.Current.Request.Url.Port 

1

các Request.ServerVariablesđối tượng làm việc cho tôi. Tôi không biết lý do gì để không sử dụng nó.

ServerVariables["SERVER_NAME"]và ServerVariables["HTTP_URL"]sẽ nhận được những gì bạn đang tìm kiếm


1

Bạn có thể thử mã sau để có được tên miền hoàn toàn đủ điều kiện:

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host

4
Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
— Dr Rob Lang

1

Đây là một cách nhanh chóng dễ dàng để chỉ cần lấy tên của url.

            var urlHost = HttpContext.Current.Request.Url.Host;

            var xUrlHost = urlHost.Split('.');
            foreach(var thing in xUrlHost)
            {
                if(thing != "www" && thing != "com")
                {
                    urlHost = thing;
                }
            }

0

Thử đi:

@ Request.Url.GetLeftPart (UriPartial.Authority)


Câu trả lời này không giải thích tại sao nó hoạt động, và trên thực tế, nó giống hệt với một trong những câu trả lời hiện có.
— Arturo Torres Sánchez

-1

Để nhận URL cơ sở trong MVC ngay cả với miền phụ www.somedomain.com/subdomain:

var url = $"{Request.Url.GetLeftPart(UriPartial.Authority)}{Url.Content("~/")}";
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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.