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

时间:2014-06-06 11:14:12

标签: c# asp.net-mvc-3

我有以下网址

http://yellowcpd.testpace.net

如何从中获取 yellowcpd ?我知道我可以用字符串解析来做到这一点,但是在C#中有内置的方式吗?

6 个答案:

答案 0 :(得分:4)

试试这个

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

答案 1 :(得分:4)

假设您的网址始终为testpace.net,请尝试以下操作:

var subdomain = Request.Url.Host.Replace("testpace.net", "").TrimEnd('.');

它只会给你主持人的非testpace.net部分。如果您没有Request.Url.Host,则可以改为new Uri(myString).Host

答案 2 :(得分:2)

这符合法案。

分成两行:

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

或者一个人:

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

答案 3 :(得分: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#。只是为了确认你的期望......我测试了三个值,如果使用了exclude标志,这个方法总是只返回“yellowcpd”。

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

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

答案 4 :(得分:1)

  

如何从中获取yellowcpd?我知道我可以用字符串做到这一点   解析,但在C#中有内置的方法吗?

.Net没有提供内置功能来从Uri.Host中提取特定部分。您必须自己使用字符串操作或正则表达式。

域名字符串中唯一不变的部分是TLD。 TLD是域名字符串的最后一位,例如.com,.net,.uk等。其他所有内容都取决于其位置的特定TLD(因此您不能假设最后一个部分是&#34;域名&#34; as。对于.co.uk,它将是.co

答案 5 :(得分:0)

正如其他人所指出的那样,你可以这样做:

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,并取下一个标签”。