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


推荐阅读

    linux获取地址命令?

    linux获取地址命令?,地址,网络,信息,系统,设备,终端,命令,中心,管理,数字,lin

    linux获取地址命令?

    linux获取地址命令?,地址,网络,信息,系统,设备,终端,命令,中心,管理,数字,lin

    linux使用命令的方法?

    linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,

    linux上获取网管命令?

    linux上获取网管命令?,地址,系统,网络,信息,电脑,服务,网关,状态,名字,中心,l

    linux命令行获取ip?

    linux命令行获取ip?,地址,系统,代码,信息,电脑,服务,状态,密码,命令,网卡,【L

    linux命令获取主机名?

    linux命令获取主机名?,工作,地址,管理,系统,信息,命令,目录,软件,代码,策略,L

    linux获取网速命令?

    linux获取网速命令?,网络,工具,软件,地址,设备,5G,名称,工作,通讯,分析,linux

    linux命令获取时分秒?

    linux命令获取时分秒?,时间,系统,体系,标准,命令,工具,管理,国家,大陆,信息,l

    linux命令获取机器码?

    linux命令获取机器码?,地址,设备,工作,信息,命令,管理,系统,工具,目录,网络,l

    linux获取用户名命令?

    linux获取用户名命令?,系统,密码,信息,地址,名称,代码,命令,用户名,用户,用

    linux获取时间戳命令?

    linux获取时间戳命令?,时间,地址,工作,系统,数字,连续,信息,命令,管理,位置,l

    linux获取目录命令行?

    linux获取目录命令行?,工作,系统,地址,信息,数据,命令,标准,名称,环境,位置,l

    linux的获取ip命令?

    linux的获取ip命令?,地址,网络,系统,信息,设备,终端,技术,命令,数字,名称,lin

    linux只获取ip命令?

    linux只获取ip命令?,地址,网络,系统,信息,设备,数字,终端,命令,电脑,技术指

    linux命令行获取公网?

    linux命令行获取公网?,地址,网络,信息,系统,电脑,命令,终端,状态,名称,通信,

    linux命令输入方法?

    linux命令输入方法?,系统,电脑,密码,管理,地址,命令,网站,工具,首开,位置,lin

    linux如何获取命令行?

    linux如何获取命令行?,系统,工具,密码,信息,软件,命令,终端,位置,管理,发行,

    linux命令获取进程号?

    linux命令获取进程号?,网络,系统,情况,信息,工具,设备,状态,软件,进程,实时,l

    linux的hz获取命令?

    linux的hz获取命令?,系统,工作,管理,基础,信息,地址,状态,时间,网络,命令,别

    linux获取命令行结果?

    linux获取命令行结果?,系统,信息,工作,地址,设备,命令,软件,环境,目录,文件,L