多Blazor应用部署同IIS应用池报500.35错误 求替代解决方案
解决方案
根本原因说明
你遇到的报错本质是ASP.NET Core默认的*进程内(InProcess)*托管模型限制:同一个IIS工作进程(w3wp.exe)中仅允许加载一个.NET Core运行时实例,同应用池下部署多个进程内托管的.NET Core/5+应用时,会出现运行时加载冲突。
可行方案(无需创建独立应用池)
方案1:统一修改所有应用为进程外(OutOfProcess)托管(最推荐)
该方案将原本运行在IIS工作进程内的应用改为独立的Kestrel进程运行,IIS的ANCM模块仅作为反向代理转发请求,同一个应用池下可以共存多个独立的Kestrel进程,完全规避运行时冲突,不需要调整现有IIS应用池架构。
修改方式有两种,二选一即可:
- 项目发布前修改:在每个Blazor应用的
.csproj项目文件的PropertyGroup节点中添加如下配置,重新发布即可:
<AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
- 服务器端直接修改:无需重新发布,逐个修改每个应用根目录下的
web.config文件,找到aspNetCore节点,添加hostingModel="OutOfProcess"属性,示例如下:
<aspNetCore processPath="dotnet" arguments=".\你的应用名称.dll" hostingModel="OutOfProcess" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
注意:必须将同应用池下所有.NET 5+应用都修改为进程外托管,再回收对应应用池即可生效,只要有一个应用仍为进程内托管就会触发冲突。
方案2:合并多个应用为单个宿主应用
如果你的多个Blazor应用业务关联度较高,可以将所有应用改造为同一宿主下的不同模块,通过区域(Area)、虚拟路径路由区分不同业务应用,本质上是单个ASP.NET Core应用,天然支持运行在单个应用池中。该方案需要调整代码架构,改造成本高于方案1。
补充说明
进程外托管的性能损耗极低,仅存在IIS反向代理的微小开销,绝大多数业务场景下和进程内托管的性能差异可忽略,完全可以支撑50个应用的正常运行。
如果后续仍然考虑拆分应用池,可开启应用池的闲置超时自动回收配置,闲置的应用池几乎不会占用过多系统资源,50个低并发应用的资源总占用也远低于预估。
内容的提问来源于stack exchange,提问作者CuriousCarnivore
相关产品推荐
相关产品推荐

