两年来的core折腾之路几点总结,附上nginx启用http2拿来即用的配置
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两年来的core折腾之路几点总结,附上nginx启用http2拿来即用的配置相关的知识,希望对你有一定的参考价值。
为什么要迁移,江湖上传说windows server的稳定性不如某某某,这类议题与八卦新闻没两样,不谈,如果windows的价钱能够和linux相同或者差异不至于那么大,我才懒得换,因为穷,这才是重点。
涉及IO路径拼接,一定要Path.Combine, 反正我自己眼力比较差,手工拼接的话,有时候多一个或少一个斜杠,或者斜杠方向反了,Linux系统都会出错,搞半天不知道错在哪,如果大小写都搞错却没注意或者一时不知的话,神仙都救不了。
注意用System.Environment.NewLine代替硬编码的换行符,String.Empty代替"",这两个看不见的东西,发作的时候喝脑白金都没用。
而core在初始化的时候,会遍历wwwroot文件夹包含的所有内容,在windows中无所谓你文件夹怎么命名,在中文centos也无所谓你文件夹怎么命名。但是,如果你的生产服务器是英文系统,恰好在wwwroot中有中文文件夹的话,你都不知道为什么会全局报错。关于中文文件夹(在某些时刻会演变为乱码文件夹),我也不知哪里来的,有些客户端编辑器组件,就是包含了非英文的文件夹。所以搭建虚拟机测试环境的时候,guest系统需要安装英文版本来验证。
newtonsoft的json在反序列化枚举类型的时候,得到的是名,微软自家的json在反序列化枚举的时候,得到的是值,虽然可以通过特性来定义,但是本人对特性相当反感,全套代码不会用也不可能会用,所以有时候需要用class来代替enum。
Microsoft.AspNetCore.NodeServices 是个好东西,就简单来说,正则表达式验证库,只写一次,客户端和服务端都可以共用。
Program.Main方法里,可以建立后台线程,里面放一个全局静态的ConcurrentQueue<Action>,while(true)定时监视它,今天我们编写的是进程级的asp.net,你可以让它做很多IIS做不到的真正异步,比如说记录某些日志,扔action进去就是了,不必等待。
事情还可以做得更绝一些:开辟新进程,把代价高昂的、不确定是否会出错的、却需要立即清理内存的操作丢给它,操作完了自动关闭,在这一层面上,你可以藐视.net的垃圾回收。
如果你实在玩不来gulp也没关系,装个BundlerMinifier就行了,右键选几个js后自动压缩
能用PocoController的时候,尽量用,比如说某些频繁的API,它的资源占用最小。
为HttpClient建立池,static ConcurrentQueue<HttpClient>,两三个就够了,一般不会出错,但是谁也不能保证网络请求,错了一个就让下一个来代替,然后把出错的扔到上面的ConcurrentQueue<Action>中让它爱什么时候销毁什么时候销毁。
文件级数据库,比如说SQLite,也需要ConcurrentQueue<Action>来封装写入逻辑,绝对的保证同一时刻只有一个线程写,同时做好定时自动备份并且是每小时、每半天、每天、每星期这样的多个备份,否则不可预料的IO把你的数据库搞坏,喊天天不应。
总会遇到有人和你劝说XXX是世界上最好的语言,遇到这些事情我不会争论的,给他一份最新的岛国女演员名单就可以了。
windows上你不能覆盖一个正在运行中的dll,但是linux上可以,先覆盖,再重启,但是如果连重启都不允许的话,就开启新的端口,让前段服务器热切换,nginx的reload命令是实时的,如果你连前nginx也没有,直接kestrel面向公众,却又不允许一秒钟以上的暂停服务,那就新建服务器来等待域名DNS切换吧。
传统ASP.NET的Bundle功能现在见不到了,需要在开发阶段手动通过gulp来压缩,但是如果遇到需要实时构造js的情况怎么办? 现在既然有了NodeServices,服务端压缩在理论上不是问题,目前我还没实现,正在研究。
别折腾与XML相关的东西,凡是XML做的事,都可以用JSON来代替,光是头部一大车的uri垃圾代码与脱裤子放屁的namespace两项,足以让我彻底抛弃它。
该缓存的东西,用内存来缓存,比如说某些不可能上万条目的目录, 建一个静态字典才1M不到,却可以少做一次inner join。
该不该内联javascript,对此我分两个阶段,项目初期是内联几句最简单的代码,动态生成script标签来请求真正需要的javascript,然后把内容记录到本地indexedDB中,以后再也不请求js代码了,从本地数据库中读即可,head加一个meta标签来标识javascript是否需要重新读取,css也是同样的道理,如此一来内联的代码也就十多行,这价钱花得起。到了第二阶段,内联和本地数据库也省了,因为有了http2,服务端推送结合max-age,一次TCP连接也是花费得起的(注意这里说的是TCP, TCP!),它同样是仅一次真正传输内容。
关于 public async Task<IActionresult> xxxx() ,此异步非彼异步,具体就不详解了,请自行搜索。有时候我们需要在一个请求上下文中同时做到等同于桌面应用中的“真异步”,你就不要await,虽然visual studio会给出绿色提示说让你为某个task加上await,加上的话你才是错了。而是应该TASK的start()后干别的事情,在方法最后统一waitall。当然此方式涉及到线程开销,要根据具体问题来取舍。
可能你会需要这一段代码,否则MVC自带的 return Json(某对象) 会被强制修改为小写,据说那是JSON规范,少来,鸡毛规范和我一点关系没有,我只认识过度的自作聪明是找骂。
1
以上是关于两年来的core折腾之路几点总结,附上nginx启用http2拿来即用的配置的主要内容,如果未能解决你的问题,请参考以下文章 两年来的core折腾之路几点总结,附上nginx启用http2拿来即用的配置 |