104

我想知道在 ASP.NET 中获取当前域的最佳方法是什么?

例如:

http://www.domainname.com/subdir/应该产生http://www.domainname.com http://www.sub.domainname.com/subdir/应该产生http://sub.domainname.com

作为指导,我应该能够直接在 URL 上添加一个类似“/Folder/Content/filename.html”的 URL(比如由 ASP.NET MVC 中的 Url.RouteUrl() 生成),它应该可以工作。

4

11 回答 11

189

与 MattMitchell 的答案相同,但有一些修改。这将检查默认端口。

编辑:更新语法并Request.Url.Authority按照建议使用

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"
于 2010-05-20T22:34:17.400 回答
42

根据此链接,一个很好的起点是:

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

但是,如果域是http://www.domainname.com:500 ,这将失败。

像下面这样的东西很容易解决这个问题:

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

但是,端口 80 和 443 将取决于配置。

因此,您应该使用上面来自 Carlos MuñozIsDefaultPort的已接受答案。

于 2008-09-15T03:06:03.513 回答
29
Request.Url.GetLeftPart(UriPartial.Authority)

这是包含的方案。

于 2011-12-31T05:30:03.880 回答
20

警告!对于使用Current.Request .Url.Host 的任何人。了解您正在根据当前请求工作,并且当前请求不会始终与您的服务器一起使用,有时可能与其他服务器一起使用。

因此,如果您在 Global.asax 中的 Application_BeginRequest() 之类的地方使用它,那么 99.9% 的情况下它会很好,但 0.1% 的情况下您可能会得到除您自己的服务器主机名之外的其他内容。

我不久前发现的一个很好的例子。我的服务器不时会访问http://proxyjudge1.proxyfire.net/fastenv 。Application_BeginRequest() 很乐意处理此请求,因此如果您在发出此请求时调用 Request.Url.Host,您将返回 proxyjudge1.proxyfire.net。你们中的一些人可能会想“不,”但值得注意,因为这是一个很难注意到的错误,因为它只发生了 0.1% 的时间:P

这个错误迫使我将我的域名主机作为字符串插入到配置文件中。

于 2011-04-30T23:27:49.337 回答
14

为什么不使用

Request.Url.Authority

它返回整个域和端口。

您仍然需要计算 http 或 https

于 2011-07-17T23:38:24.273 回答
3

简单简短的方法(它支持模式、域和端口):

采用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://example.com:5031
// Example output:    http://example.com:5031
于 2017-08-20T02:36:56.183 回答
1

怎么样:

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"];
于 2008-09-15T15:40:13.513 回答
1

其他方式:


string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);
于 2010-02-24T15:00:37.317 回答
1

Asp.Net Core 3.1中,如果您想获得完整的域,您需要执行以下操作:

第 1 步:定义变量

private readonly IHttpContextAccessor _contextAccessor;

第 2 步:DI 进入构造函数

public SomeClass(IHttpContextAccessor contextAccessor)
{
    _contextAccessor = contextAccessor;
}

第 3 步:在您的类中添加此方法:

private string GenerateFullDomain()
{
    string domain = _contextAccessor.HttpContext.Request.Host.Value;
    string scheme = _contextAccessor.HttpContext.Request.Scheme;
    string delimiter = System.Uri.SchemeDelimiter;
    string fullDomainToUse = scheme + delimiter + domain;
    return fullDomainToUse;
}
//Examples of usage GenerateFullDomain() method:
//https://example.com:5031
//http://example.com:5031
于 2020-09-20T06:25:33.927 回答
0

使用 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();
于 2015-04-01T07:28:13.543 回答
-1

怎么样:

String domain = "http://" + Request.Url.Host
于 2008-09-15T03:14:04.697 回答