【问题标题】:How can I get a part/subdomain of my URL in C#?如何在 C# 中获取我的 URL 的一部分/子域?
【发布时间】:2014-07-27 15:28:22
【问题描述】:

我有如下网址

http://yellowcpd.testpace.net

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

【问题讨论】:

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


【解决方案1】:

试试这个

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

【讨论】:

  • @jared 我只是写它来将字符串拆分为数组,然后您可以使用数组的索引来获取特定的单词。
  • 我认为你想要Request.Url.Host 而不是Request.Url.AbsolutePath,因为后者会给你域名之后的一切。
【解决方案2】:

假设您的 URL 始终是 testpace.net,试试这个:

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

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

【讨论】:

    【解决方案3】:

    这符合要求。

    分成两行:

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

    或超过一个:

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

    【讨论】:

      【解决方案4】:

      您的问题的简单答案是没有内置方法来提取子域。话虽如此,这就是我使用的解决方案......

      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)

      【讨论】:

        【解决方案5】:

        我怎样才能从中得到黄色cpd?我知道我可以用字符串做到这一点 解析,但是C#中有内置的方法吗?

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

        域字符串中唯一不变的部分是 TLD。 TLD 是域字符串的最后一位,例如 .com、.net、.uk 等。其下的所有其他内容都取决于特定 TLD 的位置(因此您不能假设倒数第二部分是“域名”,对于 .co.uk,它将是 .co

        【讨论】:

          【解决方案6】:

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

          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 中的子域(黄色cpd)”,但这可能是不可能的,因为有效主机名的规则允许任意数量的标签(参见Valid Host Names)。主机名可以有任意数量的标签,以句点分隔。您将不得不添加额外的限制来获得您想要的,例如“将主机名分成标签,如果存在则丢弃 www 并获取下一个标签”。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-26
            • 1970-01-01
            • 2015-08-20
            • 1970-01-01
            • 2013-06-15
            • 2023-03-16
            相关资源
            最近更新 更多