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

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

What's the best method in ASP.NET to obtain the current domain?

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

例如:

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

作为指导,我应该能够直接在URL上添加一个URL,例如" /Folder/Content/filename.html"(例如,由ASP.NET MVC中的Url.RouteUrl()生成)。


答案与MattMitchell相同,但有所修改。
而是检查默认端口。

Edit: Updated syntax and using Request.Url.Authority as suggested

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


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

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

但是,如果域为http://www.domainname.com:500,则此操作将失败。

诸如此类的东西很想解决此问题:

1
2
3
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?oz的"已接受答案"中那样使用IsDefaultPort


1
Request.Url.GetLeftPart(UriPartial.Authority)

这是包含的方案。


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

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


为什么不使用

Request.Url.Authority

它返回整个域和端口。

您仍然需要输入http或https


简单快捷(支持架构,域和端口):

使用Request.GetFullDomain()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 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

其他方式:

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

怎么样:

1
2
3
4
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"];

使用UriBuilder:

1
2
3
4
5
6
7
8
9
10
11
12
    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();

怎么样:

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


推荐阅读