如何在ASP.NET中获取当前域名


82

我想在asp.net c#中获取当前域名。

我正在使用此代码。

string DomainName = HttpContext.Current.Request.Url.Host;

我的网址是,localhost:5858但仅返回localhost

现在,我在本地主机中使用我的项目。我想获得本地主机:5858。

再举一个例子,当我使用这个域名时

www.somedomainname.com

我想得到 somedomainname.com

请告诉我如何获取当前域名。


1
主机名和域名是两件事。您是否需要一个映射到您的特定IP地址的域,或要运行其的计算机的主机名?
罗布·古德温


var base_url =“ @ Request.Url.GetLeftPart(UriPartial.Authority)@ Url.Content(”〜/“)”
普拉萨德亲王

Answers:


75

使用Request.Url.Host是合适的-这是您检索HTTPHost:标头的值的方法,该标头指定UA(浏览器)所需的主机名(域名),因为HTTP请求的资源路径部分不包含主机名。

请注意,这localhost:5858不是域名,而是端点说明符,也称为“权威”,其中包括主机名和TCP端口号。可通过访问进行检索Request.Uri.Authority

此外,somedomain.com从那里获取数据是无效的,www.somedomain.com因为可以将Web服务器配置为供www.somedomain.com与相比使用其他站点somedomain.com,但是,如果您确定在这种情况下这是有效的,则您需要手动解析主机名,尽管String.Split('.')在紧要关头。

请注意,Web服务器(IIS)配置与ASP.NET的配置不同,并且ASP.NET实际上完全不了解其下运行的网站和Web应用程序的HTTP绑定配置。IIS和ASP.NET共享相同的配置文件(web.config),这是一个错误的事实。


112

尝试获取网址的“左侧”,如下所示:

string domainName = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);

这会给你要么http://localhost:5858或者https://www.somedomainname.com无论你是在本地或生产。如果要删除该www部分,则应配置IIS,但这是另一个主题。

请注意,生成的URL不会带有斜杠。


7
我认为这应该是最好的答案。
安德鲁

这非常适合我的需求。但是,有一个小小的更正:当请求Authority部分时,返回的字符串将不包含尾随路径定界符。因此:http://localhost:60333
威尔

1
var base_url =“ @ Request.Url.GetLeftPart(UriPartial.Authority)@ Url.Content(”〜/“)”
普拉萨德亲王

这似乎不适用于Asp.Net Core 2.2。我正在获取“ HttpContext”不包含“当前”的定义,并且找不到可以接受的扩展方法“当前”接受类型为“ HttpContext”的第一个参数(您是否缺少using指令或程序集引用?)。
斯蒂安

@Stian显然,已经有另一篇文章回答了这个问题:stackoverflow.com/questions/31243068/…。此答案仅集中在URI部分。
Arturo TorresSánchez19年

39

这是其Request.RequestUri所有属性的屏幕截图,供所有人参考。

在此处输入图片说明


18

您可以尝试以下代码:

 Request.Url.Host +
    (Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port)

6

www.somedomain.com 域/主机。子域是重要的部分。www.通常与没有一个可互换使用,但是必须将其设置为规则(即使默认设置),因为它们不相等。考虑另一个子域,例如mx.。该目标可能与的目标不同www.

鉴于此,我建议您不要做这种事情。就是说,既然您要问,我想您有充分的理由。

就个人而言,我建议www.为此特别包装。

string host = HttpContext.Current.Request.Url.GetComponents(UriComponents.HostAndPort, UriFormat.Unescaped);;

if (host.StartsWith("www."))
    return host.Substring(4);
else
    return host;

否则,如果您真的100%确定要砍掉任何子域,则将需要一些更复杂的操作。

string host = ...;

int lastDot = host.LastIndexOf('.');

int secondToLastDot = host.Substring(0, lastDot).LastIndexOf('.');

if (secondToLastDot > -1)
    return host.Substring(secondToLastDot + 1);
else
    return host;

就像其他人所说的那样获得港口。


1

HttpContext.Current.Request.Url.Host返回正确的值。如果您在www.somedomainname.com上运行它,它将为您提供www.somedomainname.com。如果您还想获得5858,则需要使用

HttpContext.Current.Request.Url.Port 

1

Request.ServerVariables对象对我有用。我不知道不使用它的任何理由。

ServerVariables["SERVER_NAME"]ServerVariables["HTTP_URL"]应该得到您想要的


1

您可以尝试以下代码来获取完全合格的域名:

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

4
尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
罗伯·朗(Rob Lang)博士

1

这是获取网址名称的快速简便方法。

            var urlHost = HttpContext.Current.Request.Url.Host;

            var xUrlHost = urlHost.Split('.');
            foreach(var thing in xUrlHost)
            {
                if(thing != "www" && thing != "com")
                {
                    urlHost = thing;
                }
            }


-1

要在MVC中获得基本URL(即使具有子域)www.somedomain.com/subdomain

var url = $"{Request.Url.GetLeftPart(UriPartial.Authority)}{Url.Content("~/")}";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.