前言

有个很简单的需求,想从 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/..."
);

ASP.NET Core Library – Nager.PublicSuffix的更多相关文章

  1. 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!

    写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...

  2. ASP.NET CORE MVC 2.0 项目中引用第三方DLL报错的解决办法 - InvalidOperationException: Cannot find compilation library location for package

    目前在学习ASP.NET CORE MVC中,今天看到微软在ASP.NET CORE MVC 2.0中又恢复了允许开发人员引用第三方DLL程序集的功能,感到甚是高兴!于是我急忙写了个Demo想试试,我 ...

  3. 基于 ASP.NET Core 2.1 的 Razor Class Library 实现自定义错误页面的公用类库

    注意:文中使用的是 razor pages ,建议使用 razor views ,使用 razor pages 有一个小坑,razor pages 会用到 {page} 路由参数,如果应用中也用到了这 ...

  4. ASP.NET Core and .NET Core Library Support

    ASP.NET Core and .NET Core Library Support 详情参见:https://github.com/linezero/NETCoreLibrary/blob/mast ...

  5. ASP.NET Core 1.0 开发记录

    官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...

  6. ASP.NET Core: You must add a reference to assembly mscorlib, version=4.0.0.0

    ASP.NET Core 引用外部程序包的时候,有时会出现下面的错误: The type 'Object' is defined in an assembly that is not referenc ...

  7. ASP.NET Core中的依赖注入(1):控制反转(IoC)

    ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...

  8. ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)

    Bipin Joshi (http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx) Uplo ...

  9. Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  10. 来份ASP.NET Core尝尝

    0x01.前言 学习ASP.NET Core也有一段时间了,虽说很多内容知识点还是处于一知半解的状态,但是基本的,还是 略懂一二.如果有错误,还望见谅. 本文还是和之前一样,Demo+在Linux下运 ...

随机推荐

  1. 诺基亚8110 4G手机强制格式化方法

    关机状态下,先按住上键,再按住开机键,出现开机动画时松开开机键,出现硬割界面下键选择第一个wipe用开机键确认yes,再次出现硬格界面,下键选择第二个wipe用开机键确认yes,再次出现硬格界面开机键 ...

  2. PHP中引用的详解(引用计数、写时拷贝)

    转载:https://blog.csdn.net/ljguo212/article/details/8972865 1. PHP中引用的特性 PHP中引用意味着用不同的名字访问同一个变量内容,引用不是 ...

  3. [oeasy]python0109_tty_打字头_电传打字机_字模_点阵字库

    点阵字库 回忆上次内容 上次回顾了 字符字型 的 进化过程 从 谷腾堡 活字 到 罗马正字 和 意大利斜体   罗马帝国战斗力的征服 和 基督教文化传播 使得 拉丁字符 在日耳曼语地区广泛传播 种葡萄 ...

  4. ABC349

    A link 其实,有人赢比赛,就有人输比赛,一加一减,不管进行多少场比赛,最后所有人的分数和一定是\(0\). 那么知道\(n-1\)个人的分数和,就可以知道第\(n\)个人的了. 点击查看代码 # ...

  5. PHP现代化构建工具: 无需修改任何代码和扩展将你的ThinkPHP项目性能提高20倍

    我要分享一个令人激动的黑科技:PRipple 使用这个项目能够在无需修改任何代码且无需第三方扩展的前提下,将你的 Laravel 项目性能提高 20 倍.他仅仅依赖于PHP原生的 pcntl/posi ...

  6. SEO自动外链工具的功效以及使用心得

    SEO外链发布工具原理 1.自动SEO外链工具原理:就是把您的网址提交大站长工具类似的网站上面进行搜索,然后就会在上面留下痕迹自动生成以网址为标题的静态页面. 2.自动SEO外链发布效果:我们就是利用 ...

  7. vue3 + ts 中出现 类型“typeof import(".........../node_modules/vue/dist/vue")”的参数不能赋给类型“Component<any, any, any, ComputedOptions, MethodOptions>”的参数。

    错误示例截图 解决方法 修改shims-vue.d.ts中的内容 declare module "*.vue" { import { defineComponent } from ...

  8. 【DataBase】MySQL 03 基本命令 & 语法规范

    参考至视频:P12 - P15 https://www.bilibili.com/video/BV1xW411u7ax?p=82 SHOW 和相关的基本命令 查看所有的数据库 SHOW DATABAS ...

  9. 【C3】07 盒子模型

    在 CSS 中,所有的元素都被一个个的"盒子(box)"包围着, 理解这些"盒子"的基本原理,是我们使用CSS实现准确布局.处理元素排列的关键. 本文围绕 &q ...

  10. How to evaluate the Messi Hong Kong fraud incident?

    Who is Lionel Messi? URL: https://en.wikipedia.org/wiki/Lionel_Messi As a famous football player, Me ...