ASP.NET中获取当前域的最佳方法是什么?

时间:2008-09-15 03:04:09

标签: asp.net asp.net-mvc domain-name

我想知道获取当前域的最佳方法是在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()生成),它应该可以工作

11 个答案:

答案 0 :(得分:178)

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

  

修改:更新语法并按建议使用Request.Url.Authority

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"

答案 1 :(得分:37)

根据this link,一个很好的起点是:

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将取决于配置。

因此,您应该使用上面Accepted Answer中的IsDefaultPort来自CarlosMuñoz。

答案 2 :(得分:28)

Request.Url.GetLeftPart(UriPartial.Authority)

这是包含方案。

答案 3 :(得分:19)

警告!对于使用 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

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

答案 4 :(得分:13)

为什么不使用

Request.Url.Authority

它返回整个域和端口。

您仍然需要计算http或https

答案 5 :(得分:2)

简单简短方式(它支持架构,域和端口):

使用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

答案 6 :(得分: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"];

答案 7 :(得分:1)

另一种方式:


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

答案 8 :(得分: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();

答案 9 :(得分:0)

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

答案 10 :(得分:-1)

怎么样:

String domain = "http://" + Request.Url.Host