网站平台迁移到ASP.NET 8.0

Asia/Shanghai | 3 comments
网站平台迁移到ASP.NET 8.0
网站平台迁移到ASP.NET 8.0

This post is over a year old, some of this information may be out of date.

距离微软正式发布.NET 8.0已经有一段时间,这也是新的LTS(长期技术支持)版本,这个版本更新了多个新的特性,并且提升了性能,似乎每一代框架发布总是能比上一代提升不少性能。近期抽空将本网站平台适配到了.NET 8.0,暂时没有发现什么Breaking Changes,一切很平滑,除了升级到.NET 8.0外,还对以下特性进行了修改:

1. 软件层面

1.1 验证码模块

验证码(CAPTCHA)又称全自动区分计算机和人类的图灵测试,之前本站验证码使用了两套:一套是Edi Wang开发的图形化验证码,主要用在评论发布页面;另一套是Google的reCAPTCHA,主要用在联系表单。但是这两套验证码都存在问题,其中Edi Wang的图形验证码使用了传统的数字字母图片,为了避免OCR还加了变形扭曲,在Web 2.0兴起的年代,这种方法足够抗击机器人和爬虫的不法攻击,随着人工打码平台和ChatGPT AI的兴起,这类验证码也逐步失去效力;Google reCAPTCHA的抗攻击性相较于传统验证码较强,本站先前联系表单一直使用了reCAPTCHA的Invisible模式验证码,这类验证码通过收集用户行为数据实现区分人与机器行为,但是问题是Google也有广告业务,所以ReCAPTCHA可能会将收集到的行为数据用于广告优化,对隐私不是足够友好,这也是我为什么只在联系表单这类用的比较少的栏目下部署的原因。

说回本次更新,这次采用了Cloudflare的验证码机制Turnstile,貌似翻译成“Cloudflare 安全质询”,据Cloudflare官方声称是隐私友好的身份识别方式,考虑到Cloudflare的声誉,并且本站基础设施也依赖于Cloudflare,于是决定将验证码模块全部替换为Turnstile,为用户提供更为安全和友好的人机区分测试,现在访问本站的朋友会发现联系表单和评论的新改变。

Cloudflare Turnstile也有一些问题,比如无法跟随系统明暗变化,也没有手动设置明暗变化的API,偶尔会出现“Turnstile Widget seem to have crashed”的问题导致无法加载,这些希望Cloudflare后期能有相关改进。

1.2 消息队列模块

本站最早对于评论邮件提醒、联系表单使用了最为粗暴的实现方式,即当用户点击发送按钮,网站后台立即连接邮件服务器进行投递,这样做最大的问题就是,发送点击后会卡住——用户必须等待网站后台连接邮件服务器、发送邮件、获取返回消息等一系列操作完成,这样用户体验相当差,多个用户同时进行相同操作时容易导致服务器负载过高,有一定概率会出现失败的情况。

后来本站使用了RabbitMQ消息队列改进了这一操作,也就是说涉及到邮件等长操作类型,将会先将操作投递给RabbitMQ消息队列,由消息队列在后台处理,这样做的好处是,用户操作会立即获得返回,无需长时间等待,即使多个用户同时操作也会进行排队,由后台慢慢处理。

实际上网站与RabbitMQ配合的实现仍然有个Bug,也就是我偷懒没有实现消息投递失败的重投机制,带来的潜在害处就是容易丢消息,而且RabbitMQ是单独的应用,与网站应用的通讯较为复杂(存在一定时耗),也受到RabbitMQ可用性的影响,需要额外监控RabbitMQ的可用性,对于网站投递邮件这种简单的工作来说还是太重了。所以这次更新索性直接用.NET库Hangfire替换了,替换后执行效率大为提高,毕竟属于进程内部通讯,,Hangfire也自带失败重投机制,同时Hangfire也有一个漂亮的后台面板,可以观察到所有后台任务执行状况。

1.3 前端代码

升级了jQuery到3.7.1,升级了代码渲染的Prism库,并支持了更多的代码样式,修改了部分前端代码以适配Cloudflare Turnstile,修改了明暗自动切换跟随模式。

对于jQuery,其实早期jQuery的引入是为了屏蔽不同浏览器的兼容问题并且更好的支持一些特性(比如Selector),随着JavaScript代码的成熟和浏览器的“大一统”时代的来临(基本考虑以FireFox为代表的Gecko内核和以Chrome、Safari为代表的Webkit内核就可以了),实际上jQuery正逐步沦为鸡肋,本站后引入前端代码基本上已经不依赖于jQuery,之所以仍然保留jQuery主要还是因为一些库比较老旧,自己也懒得去重新造轮子,后期一时兴起或许真会重新造轮子,到那时候就可以甩掉jQuery这个历史包袱了。

2. 硬件层面

2.1 服务器设施

目前服务器设施没有新的变化,仍然依托于Cloudflare的CDN,出于安全考虑使用了Cloudflare Tunnel,由于我的网站使用的CNAME接入,存在Cloudflare的数字证书更新的问题,而且Cloudflare对国内用户在访问速度和质量上仍然不尽人意,后期再考虑选择更快的服务器吧。

修改的特性就先说到这儿,总之这个网站平台还有很多地方不尽人意,比如后台界面仍然属于“毛坯房”,存在不少Bug,好在后台这个主要还是自己用,在懒的前提下忍一忍也就过去了。

目前ASP.NET仍然做不到热更新,也就是说我升级某个模块就必须停止并升级再重新启动整个网站,对于本站则是本地编译Docker镜像,服务器拉取并重建,问题在于启动到网站恢复访问会比较慢,对访客并不友好。

好了,就先写这么多。

Comments

  1. 我也还在用 jQuery,习惯了它的链式写法。

    Author Replied:

    是的,其实能解决问题的方案就是好的方案,毕竟jQuery也还在维护更新。

  2. 自动校验挺好,不用每次都自己手动点击校验,麻烦。

    Author Replied:

    是的,但是偶尔还是会加载失败。

  3. 建议买下也门国别域名,wang.ye

    Author Replied:

    这个建议很有趣,因为早些年我也关注过国别域.ye,但是发现.ye域名价格很不友好,也没有知名代理商,再加上也门政局不稳定,遂放弃了购买ye域名这个想法,当然也有一些很有趣的域名hacks,比如国别域名.ge(格鲁吉亚),.li(列支敦士登)等等都可以做姓名域名的hack,还有一类新顶级域比如.wang,但是ye.wang的要价还是很高(貌似已经被出售),所以不再考虑了。