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
最后决定使用 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的更多相关文章
- 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!
写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...
- 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想试试,我 ...
- 基于 ASP.NET Core 2.1 的 Razor Class Library 实现自定义错误页面的公用类库
注意:文中使用的是 razor pages ,建议使用 razor views ,使用 razor pages 有一个小坑,razor pages 会用到 {page} 路由参数,如果应用中也用到了这 ...
- ASP.NET Core and .NET Core Library Support
ASP.NET Core and .NET Core Library Support 详情参见:https://github.com/linezero/NETCoreLibrary/blob/mast ...
- ASP.NET Core 1.0 开发记录
官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...
- 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 ...
- ASP.NET Core中的依赖注入(1):控制反转(IoC)
ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...
- ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)
Bipin Joshi (http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx) Uplo ...
- Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- 来份ASP.NET Core尝尝
0x01.前言 学习ASP.NET Core也有一段时间了,虽说很多内容知识点还是处于一知半解的状态,但是基本的,还是 略懂一二.如果有错误,还望见谅. 本文还是和之前一样,Demo+在Linux下运 ...
随机推荐
- 基于 Impala 的高性能数仓实践之物化视图服务
本文将主要介绍 NDH Impala 的物化视图实现. 接上篇,前两篇分别讲了执行引擎和虚拟数仓,它们是让一个 SQL 又快又好地执行的关键.但如果某些 SQL 过于复杂,比如多张大表进行 Join ...
- Swift开发基础01-语法
Hello World print("Hello World") 不用编写main函数,Swift将全局范围内的首句可执行代码作为程序入口一句代码尾部可以省略分号(;),多句代码写 ...
- 在Windows系统中解决端口占用问题
在Windows系统中,你可以通过以下步骤查询并结束占用8001端口的进程: 查询占用8001端口的进程: 打开命令提示符(CMD)或者PowerShell,并执行以下命令: netstat -a ...
- Linux安全启动及Machine Owner Key(UEFI BIOS MBR GPT GRUB)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 无 前言 只要装过各种系统的人都或多或少会接触 ...
- 常用ffmpeg命令集合(收藏吧,帮你省一个录屏软件的会员费)
录制屏幕: 全屏的话用screen-capture-recoder下载地址:https://github.com/rdp/screen-capture-recorder-to-video-window ...
- python中pip安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))…………或无法pip install packname安装依赖包
问题: 安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connec ...
- springsecurity:权限与异常处理
权限即不同用户可以使用不同功能 实现前置: 在上一次登录与校验中,我们将authentication存入到SecurityContextHolder中,后续我们需要从FilterSecurityInt ...
- java开发环境安装IDEA+jdk1.8
一. 需要得安装包 (1)IDEA破解版.zip (2)jdk1.8.0_25.7z 获取方式(免费): (1) 登录-注册:http://resources.kittytiger.cn/ ...
- pidstat命令详解
pidstat命令详解 pidstat 命令是 sysstat 工具的一个命令,用来监控全部或者指定进程的CPU.内存.线程.设备IO等系统资源的占用情况.pidstat 首次运行时显示自系统启动开始 ...
- 关于VS2022无法打开源文件<stdio.h>报错
Q:本人今天下载VS2022,在billibilli观看到不靠谱教程以至于无法输出hello world A:经过网上查询发现 解决方案/侵删 web:https://www.cnblogs.com/ ...