【问题标题】:How do I check for a URL's top-level domain in ASP.NET/C#?如何在 ASP.NET/C# 中检查 URL 的顶级域?
【发布时间】:2011-04-11 12:33:27
【问题描述】:

假设“www.mysite.fr/home”是 URL ..现在我如何从中获取“fr”?只是“fr”

实际上我要做的是在检测到访问者的国家/地区后在运行时更改母版页..是的,我可以使用其他类中的 countryCode 变量,但我可能只能这样做..只是想试试..逻辑基本上是:-

if(its "fr")
{
//apply masterpage 1
}


if(its "in")
{
//apply masterpage 2
}

有可能吗?无论如何,正确的方法是什么?将包含 CountryCode 变量的类作为实用程序类,并在我的新类中使用该变量

从 URL 中获取此值“fr”或“in”??我该怎么做呢 ?有可能吗?

【问题讨论】:

  • 为什么这个问题被否决了。有什么正当理由吗?
  • @Bala:我看不到……我投了赞成票,你为什么不投呢?
  • @Mark Cidade..请在你的答案下方查看我的评论..thnx

标签: c# asp.net url


【解决方案1】:

我认为这应该是可能的。 您可以使用正则表达式获取代码(fr、in 等)并更改母版页,但您必须在 page_load 之前执行此操作。当 asp.net 到达 page_load 时,母版页已经设置好了(如果我没记错的话)。 您需要处理 PreInit 事件并设置您要设置的母版页。所以基本上在 PreInit 事件中更改所有正则表达式和母版页,你就可以开始了:)

这是对 PreInit 的描述(来源:http://msdn.microsoft.com/en-us/library/ms178472.aspx):

预初始化 在启动阶段完成后和初始化阶段开始之前引发。

将此事件用于以下目的:

•检查 IsPostBack 属性以确定这是否是第一次处理页面。此时也设置了 IsCallback 和 IsCrossPagePostBack 属性。

•创建或重新创建动态控件。

•动态设置母版页。

•动态设置 Theme 属性。

•读取或设置配置文件属性值。

【讨论】:

  • 是的..在 Page_PreInit 中包含了这个逻辑,只是因为 MasterPageFile 在页面加载中不起作用..如果我没记错的话......所以正则表达式..嗯?让我谷歌..thnx
  • 如果您的 URL 保持不变,例如 www.mysite.fr、www.mysite.in、www.mysite.us,那么您可以使用简单的字符串处理,但对于复杂的表达式,您可能需要正则表达式。它是字符串匹配的鼻祖 :)
【解决方案2】:
 if (Request.Url.Host.ToLower().EndsWith(".fr"))
  {
    ...
  }

【讨论】:

  • 我对“Request.Url.Host”返回的内容有点困惑......如果我的 URL 是 www.mysite.fr/home/myAccount.aspx......它会返回“ www.mysite.fr" 或完整的 URL 即 "www.mysite.fr/home/myAccount.aspx" ???
  • 它只会返回“www.mysite.fr”
  • 哦酷..如果这会返回那个..我认为这是要走的路..这样我就不必担心 URL 中的子字符串..我是否正确??
  • 我添加了 ToLower()。谢谢:)
  • @Mark.. 我的逻辑在 MASTER.cs 文件的 Page_PreInit 事件中。可以吗,还是我需要在某个类或其他东西中包含这个逻辑?对不起,如果这听起来很愚蠢
【解决方案3】:

没有可以直接使用的方法。也许你可以自己写一个扩展:

public static string GetDomainTypeName(this Uri uri)
{
  if (!uri.HostNameType.Equals(UriHostNameType.Dns) || uri.IsLoopback)
     return string.Empty; // or throw an exception
  return uri.Host.Split('.').Last();
}

注意单词大小写! WWW.GOOGLE.FR 可能会使您的代码不正确。

【讨论】:

    【解决方案4】:

    对于当前场景,您可以尝试使用以下 sn-p:

    string url = "www.mysite.fr/home";
                int nStrLength = url.Length;
                int nDot = url.LastIndexOf(".")+1;
    
                int nRestStringLngth = nStrLength - nDot;
    
                string baseDomain = url.Substring(nDot, nRestStringLngth);
                int nSlash = baseDomain.IndexOf("/");
                baseDomain = baseDomain.Substring(0, nSlash);
                Console.WriteLine(baseDomain);
    

    【讨论】:

      【解决方案5】:

      在法国它与 EndsWith .fr 一起使用,但在英国你有 .co.uk 或在奥地利你有 .co.at 和 .at

      您可以使用以下 nuget 包。 (安装包 Nager.PublicSuffix) https://www.nuget.org/packages/Nager.PublicSuffix/

      例子:

       var domainParser = new DomainParser();
       var data = await domainParser.LoadDataAsync();
       var tldRules = domainParser.ParseRules(data);
       domainParser.AddRules(tldRules);
      
       var domainName = domainParser.Get("sub.test.co.uk");
       //domainName.Domain = "test";
       //domainName.Hostname = "sub.test.co.uk";
       //domainName.RegistrableDomain = "test.co.uk";
       //domainName.SubDomain = "sub";
       //domainName.TLD = "co.uk";
      

      【讨论】:

        猜你喜欢
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-30
        • 2010-11-07
        • 1970-01-01
        • 2012-01-30
        • 1970-01-01
        相关资源
        最近更新 更多