我该如何在C#中获取URL的部分/子域名?

3

我有一个类似以下的URL

http://yellowcpd.testpace.net

我怎样才能从这个中获取yellowcpd呢?我知道可以使用字符串解析来实现,但是在C#中是否有内置的方法呢?


1
你想获取子域名吗?请查看http://www.webpronews.com/retrieve-subdomain-from-a-url-in-c-2006-11和https://dev59.com/tmIj5IYBdhLWcg3w8ZUF。 - Soner Gönül
1
如果您的URL是yellowcpd.yellowcpd.testpace.net,那么结果会是什么? - Soner Gönül
是的,我们正在为不同的网站使用相同的代码库。 - Mahib
3
你要求第二个“部分”,因为www是你的例子中的第一个。请具体说明!你是指第一个非www部分吗? - allonhadaya
1
@Mahib,这样就好了。你现在明白混淆的原因了吗? - CodeCaster
显示剩余9条评论
6个回答

5
假设您的URL始终为testpace.net,请尝试以下操作:
var subdomain = Request.Url.Host.Replace("testpace.net", "").TrimEnd('.');

这只会返回 Host 中不包含 testpace.net 的部分。如果你没有 Request.Url.Host,可以使用 new Uri(myString).Host


4

试一下这个

string url = Request.Url.AbsolutePath;
var myvalues= url.Split('.');

@jared 我只是写了一个将字符串拆分成数组的函数,然后你可以使用数组索引来获取特定的单词。 - banny
2
我认为你想要的是 Request.Url.Host 而不是 Request.Url.AbsolutePath,因为后者会给你返回域名之后的所有内容。 - QFDev

3
我该如何从中获取yellowcpd?我知道可以使用字符串解析来完成,但在C#中是否有内置的方法呢?
.Net没有提供一个内置的功能来从Uri.Host中提取特定的部分。您将不得不自己使用字符串操作或正则表达式。
域字符串的唯一常量部分是TLD。TLD是域字符串的最后一部分,例如.com、.net、.uk等。在此之下的所有内容都取决于特定TLD的位置(因此您不能假设倒数第二部分是“域名”,因为对于.co.uk,它将是.co)。

2
这正好符合要求。 分成两行:
string rawURL = Request.Url.Host;
string domainName = rawURL .Split(new char[] { '.', '.' })[1];

或者超过一个:

string rawURL = Request.Url.Host.Split(new char[] { '.', '.' })[1];

2

简单地回答你的问题,没有内置的方法可以仅提取子域名。虽然如此,这是我使用的解决方案...

public enum GetSubDomainOption
{
    ExcludeWWW,
    IncludeWWW
};
public static class Extentions
{
    public static string GetSubDomain(this Uri uri,
        GetSubDomainOption getSubDomainOption = GetSubDomainOption.IncludeWWW)
    {
        var subdomain = new StringBuilder();
        for (var i = 0; i < uri.Host.Split(new char[]{'.'}).Length - 2; i++)
        {
            //Ignore any www values of ExcludeWWW option is set
            if(getSubDomainOption == GetSubDomainOption.ExcludeWWW && uri.Host.Split(new char[]{'.'})[i].ToLowerInvariant() == "www") continue;
            //I use a ternary operator here...this could easily be converted to an if/else if you are of the ternary operators are evil crowd
            subdomain.Append((i < uri.Host.Split(new char[]{'.'}).Length - 3 && 
                              uri.Host.Split(new char[]{'.'})[i+1].ToLowerInvariant() != "www") ?                     
                                   uri.Host.Split(new char[]{'.'})[i] + "." :
                                   uri.Host.Split(new char[]{'.'})[i]);
        }
        return subdomain.ToString();
    }
}

用法:

var subDomain = Request.Url.GetSubDomain(GetSubDomainOption.ExcludeWWW);

或者

var subDomain = Request.Url.GetSubDomain();

我目前将默认设置为包括WWW。您可以通过在GetSubDomain()方法中切换可选参数值来轻松地反转此操作。

我认为这样可以提供一个选项,代码看起来很好,而且似乎是C#内置的。只是为了确认您的期望......我测试了三个值,如果使用排除标志,此方法将始终仅返回“yellowcpd”。

  • www.yellowcpd.testpace.net
  • yellowcpd.testpace.net
  • www.yellowcpd.www.testpace.net

我使用的一个假设是......在.上分割主机名将始终导致最后两个值成为域(即something.com)


-1
如其他人所指出的,你可以像这样做:
var req = new HttpRequest(filename: "search", url: "http://www.yellowcpd.testpace.net", queryString: "q=alaska");
var host = req.Url.Host;
var yellow = host.Split('.')[1];

URL 的部分你想要的是主机名的一部分。你可能希望找到一些直接寻址该部分名称的方法,例如“TestSpace 中的子域 (yellowcpd)”,但这可能不可能,因为有效主机名称的规则允许任意数量的标签(请参见 Valid Host Names)。 主机名可以有任意数量的标签,用句点分隔。 你将不得不添加其他限制来获得你想要的内容,例如“将主机名分成标签,如果存在,则丢弃 www 并取下一个标签”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接