- A+
最近要升级 windows 服务器的 ASP.NET Core 2.1 专案到 3.1 版本,发现 Windows 架设在 IIS 上面的方式有所改变。
一. 除了反向代理
外,从 ASP.NET Core 3.0 起内建对 IIS in-process-hosting
预设支持(参考),可以不需要把 IIS Pool CLR 版本改为没有 Managed 程序码
(请参考),只能依赖 kestrel server 运行 web 引擎。
现在可以去除 kestrel 代表说,它避免IIS 和 Kestrel 之间的额外网路传递
,提供更好的性能
,照官方说法占用资源也会减少
,相关效能测试可以参考(Rick Strahl文章)
这对跟我一样,必须沿用 windows 主机无法替换 Linux 情况是一个好消息!
二. 注意 IIS In-process hosting
每个 app 需要建立一个专门的 pool
没办法像 asp.net mvc 一样,可以多个应用使用同一个 pool 管理。
这点可以参考我在 S.O 发问Brando Zhang 的回答:
Sharing an app pool among apps isn't supported. Use one app pool per app.
否则会出现错误 HTTP Error 500.35 - ANCM Multiple In-Process Applications in same Process
三. 虽然 ASP.NET Core 3.1 可以跟 Runtime 环境一起打包成单一执行档(self-contained single file),但遗憾,只对 kestrel server 有效,没有安装 Runtime 的 IIS Server 还是需要安装 Hosting Bundle
。
没办法像 .net core console 丢一个执行档,别人就能开箱即用的效果。
图片:在没有安装 asp.net core runtime 的 server ,运行 self-contained runtime 的 kestrel core app
图片:同样文件运行在 IIS 会报 500.19 错误