it-swarm.cn

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

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

例如:

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

作为指南,我应该能够将“/Folder/Content/filename.html”(例如由ASP.NET MVC中的Url.RouteUrl()生成的)直接添加到URL上,它应该可以正常工作。

98
Matt Mitchell

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

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

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

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

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

因此,您应该使用IsDefaultPort,如CarlosMuñoz的 Accepted Answer 上面所述。

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

这是包含计划。

28
izlence

警告! 给任何使用 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

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

19
Thirlan

为什么不用

Request.Url.Authority

它返回整个域和端口。

您仍然需要计算http或https

13
Korayem

简单 方式(它支持模式,域和端口):

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

怎么样:

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

其他方式:


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

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