it-swarm-vi.tech

Phương pháp tốt nhất trong ASP.NET để có được tên miền hiện tại là gì?

Tôi tự hỏi cách tốt nhất để có được tên miền hiện tại là gì trong ASP.NET?

Ví dụ:

http://www.domainname.com/subdir/ nên mang lại http://www.domainname.comhttp: //www.sub.domainname .com/subir / nên mang lại http://sub.domainname.com

Theo hướng dẫn, tôi sẽ có thể thêm một url như "/Folder/Content/filename.html" (giả sử như được tạo bởi Url.RouteUrl () trong ASP.NET MVC) ngay trên URL và nó sẽ hoạt động.

98
Matt Mitchell

Câu trả lời tương tự như của MattMitchell nhưng với một số sửa đổi. Điều này kiểm tra cổng mặc định thay thế.

Chỉnh sửa: Cập nhật cú pháp và sử dụng Request.Url.Authority như đề xuất

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"
180
Carlos Muñoz

Theo liên kết này điểm khởi đầu tốt là:

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

Tuy nhiên, nếu tên miền là http://www.domainname.com giáp thì điều này sẽ thất bại.

Một cái gì đó như sau đây là hấp dẫn để giải quyết điều này:

int defaultPort = Request.IsSecureConnection ? 443 : 80;
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 
  + (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : "");

Tuy nhiên, cổng 80 và 443 sẽ phụ thuộc vào cấu hình.

Do đó, bạn nên sử dụng IsDefaultPort như trong Câu trả lời được chấp nhận ở trên từ Carlos Muñoz.

37
Matt Mitchell
Request.Url.GetLeftPart(UriPartial.Authority)

Điều này được bao gồm chương trình.

28
izlence

CẢNH BÁO! Cho bất kỳ ai sử dụng Hiện tại.Request . Url.Host. Hiểu rằng bạn đang làm việc dựa trên YÊU CẦU HIỆN TẠI và yêu cầu hiện tại sẽ KHÔNG LUÔN với máy chủ của bạn và đôi khi có thể với các máy chủ khác.

Vì vậy, nếu bạn sử dụng điều này trong một cái gì đó như, Application_BeginRequest () trong Global.asax, thì 99,9% thời gian sẽ ổn, nhưng 0,1% bạn có thể nhận được một cái gì đó ngoài tên Máy chủ của chính máy chủ của bạn.

Một ví dụ tốt về điều này là một cái gì đó tôi phát hiện ra cách đây không lâu. Máy chủ của tôi có xu hướng tấn công http://proxyjudge1.proxyfire.net/fastenv theo thời gian. Application_BeginRequest () sẵn sàng xử lý yêu cầu này vì vậy nếu bạn gọi Request.Url. Khi thực hiện yêu cầu này, bạn sẽ nhận lại proxyjudge1.proxyfire.net. Một số bạn có thể nghĩ "không duh" nhưng đáng chú ý vì đây là một lỗi rất khó nhận thấy vì nó chỉ xảy ra 0,1% thời gian: P

Lỗi này đã buộc tôi phải chèn Máy chủ miền của mình dưới dạng chuỗi trong tệp cấu hình.

19
Thirlan

Tại sao không sử dụng

Request.Url.Authority

Nó trả về toàn bộ miền VÀ cổng.

Bạn vẫn cần phải tìm http hoặc https

13
Korayem

Đơn giảnngắn way (nó hỗ trợ lược đồ, miền và cổng):

Sử dụng Request.GetFullDomain()

// Add this class to your project
public static class HttpRequestExtensions{
    public static string GetFullDomain(this HttpRequestBase request)
    {
        var uri= request?.UrlReferrer;
        if (uri== null)
            return string.Empty;
        return uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
    }
}

// Now Use it like this:
Request.GetFullDomain();
// Example output:    https://www.example.com:5031
// Example output:    http://www.example.com:5031
// Example output:    https://www.example.com
2
RAM

Làm thế nào về:

NameValueCollection vars = HttpContext.Current.Request.ServerVariables;
string protocol = vars["SERVER_PORT_SECURE"] == "1" ? "https://" : "http://";
string domain = vars["SERVER_NAME"];
string port = vars["SERVER_PORT"];
1
Derek Lawless

Cách khác:


string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);
1
user280429

Sử dụng UriBuilder:

    var relativePath = ""; // or whatever-path-you-want
    var uriBuilder = new UriBuilder
    {
        Host = Request.Url.Host,
        Path = relativePath,
        Scheme = Request.Url.Scheme
    };

    if (!Request.Url.IsDefaultPort)
        uriBuilder.Port = Request.Url.Port;

    var fullPathToUse = uriBuilder.ToString();
0
Darren