ASP.NET Core Library – Nager.PublicSuffix

前言

有个很简单的需求,想从 URL 里获取到 domain 不要 subdomain。

abc.example.com -> example.com

没想到就这么简单的需求,超级难做。而且 .NET 也没有 build-in 的。

 

参考:

Get just the domain name from a URL?

Top level domain from URL in C#

 

Nager.PublicSuffix

Github 地址

NuGet 地址

最后决定使用 Plugin 来解决,它是基于 https://publicsuffix.org 的,一个所有 avaiable domain 的 list。

用这个就可以非常安全稳当的从 URL 获取到 domain 了。

public static async Task Main()
{
  // 提供 public_suffix_list.dat 文件路径
  var localFileRuleProvider = new LocalFileRuleProvider(
    @"C:\keatkeat\my-projects\asp.net core\8.0\CSharp12\CSharp12\public_suffix_list.dat"
  );

  // 2. 一定要 BuildAsync 后才能使用哦
  await localFileRuleProvider.BuildAsync();

  var domainParser = new DomainParser(localFileRuleProvider);

  var domainInfo = domainParser.Parse("sub.test.co.uk");
  //domainInfo.Domain = "test";
  //domainInfo.Hostname = "sub.test.co.uk";
  //domainInfo.RegistrableDomain = "test.co.uk";
  //domainInfo.SubDomain = "sub";
  //domainInfo.TLD = "co.uk";
}

public_suffix_list.dat 可以到这里下载 https://publicsuffix.org/list/public_suffix_list.dat

上面这个方式是我们提前下载好 .dat 文件,还有另一个方式是通过 HttpClient 直接去下载。

public static async Task Main()
{
  // 1. 创建一个 logger,如果是 Web 项目可以从 DI 拿。
  var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
  var logger = loggerFactory.CreateLogger<CachedHttpRuleProvider>();

  // 2. 创建一个 ConfigurationBuilder,如果是 Web 项目可以从 DI 拿。
  var configuration = new ConfigurationBuilder()
      // .AddInMemoryCollection(new Dictionary<string, string?>()
      // {
      //   3. 如果要覆盖 public_suffix_list.dat 下载地址可以通过 configuration
      //      下面这个是默认的
      //   ["Nager:PublicSuffix:DataUrl"] = "https://publicsuffix.org/list/public_suffix_list.dat"
      // })
      .Build();

  // 4. 创建 HttpClient
  //    这个用来发请求的
  var httpClient = new HttpClient();

  // 5. 创建 CacheProvider
  //    这个用来缓存的,它默认会把下载到的 public_suffix_list.dat 存在 Path.GetTempPath() 1 天
  var cacheProvider = new LocalFileSystemCacheProvider();
  var webRuleProvider = new CachedHttpRuleProvider(logger, configuration, cacheProvider, httpClient);

  var domainParser = new DomainParser(webRuleProvider);
  var domainInfo = domainParser.Parse("sub.test.co.uk");

  //domainInfo.Domain = "test";
  //domainInfo.Hostname = "sub.test.co.uk";
  //domainInfo.RegistrableDomain = "test.co.uk";
  //domainInfo.SubDomain = "sub";
  //domainInfo.TLD = "co.uk";
}

默认会把下载到的 public_suffix_list.dat 存在 Path.GetTempPath() 1 天。

这个 temp folder 需要高权限才能访问哦,不然会报错 Access to the path 'C:\Windows\TEMP\publicsuffixcache.dat' is denied。

给 IIS_IUSRS read 权限就可以了。

或者改成放到项目 folder。

var cacheProvider = new LocalFileSystemCacheProvider(
  cachePath: "wwwroot/..."
);

 

posted @ 2021-12-31 00:28  兴杰  阅读(116)  评论(0编辑  收藏  举报