IIS部署的ASP.NET WebForms应用每次请求后VBCSCompiler启动卡顿问题咨询
根因分析
你观察到的每次请求启动VBCSCompiler的问题,本质是Roslyn编译器进程无法正常驻留复用,只能每次请求重新拉起,具体可能的原因如下:
- 安全软件拦截:卡巴斯基的实时防护规则对两个站点的处理逻辑不同,慢实例的VBCSCompiler进程启动后被判定为可疑进程直接终止,导致下次请求需要重新启动编译器。两个实例部署时间相差几周,期间卡巴斯基的规则可能更新,也可能是两个站点的进程被分配了不同的扫描优先级/拦截规则。
- 目录权限不足:慢实例对应的IIS应用池身份对以下目录缺少必要权限:
- 站点根目录及
bin\roslyn子目录的读取、执行权限 - .NET临时编译目录
C:\Windows\Microsoft.NET\Framework[64]\v4.0.30319\Temporary ASP.NET Files\下对应站点的子目录的读取、写入权限
权限不足会导致VBCSCompiler启动后无法写入临时编译文件,直接异常退出,下次请求只能重新启动。
- 站点根目录及
- DotNetCompilerPlatform版本bug:你当前使用的
1.0.0版本的Microsoft.CodeDom.Providers.DotNetCompilerPlatform存在已知的进程驻留bug,在部分IIS环境下无法正常复用编译器进程,每次请求都会创建新实例。 - IIS应用池隐性配置差异:虽然初步排查配置一致,但需要注意应用池标识、32位兼容模式、进程回收规则、闲置超时时间等隐性配置的差异,比如正常实例用的是高权限的LocalSystem,慢实例用的是低权限的ApplicationPoolIdentity,也会导致进程启动后异常退出。
你之前移除compilers配置段的临时方案,本质是让应用回退到使用.NET Framework自带的旧版本编译器,不需要调用Roslyn的VBCSCompiler,因此不会出现反复启动进程的问题,但会损失C# 6/VB 14及以上版本的新语法支持。
彻底解决方案
- 配置安全软件信任规则:将慢实例的站点根目录、
bin\roslyn目录、.NET临时编译目录加入卡巴斯基的信任列表,排除对VBCSCompiler.exe进程的实时扫描和行为拦截,完成后重启站点测试是否还会反复启动编译器进程。 - 同步目录权限:将慢实例的所有目录权限完全同步为正常实例的权限,尤其要给对应应用池身份授予
bin\roslyn目录的执行权限、临时编译目录的读写权限。 - 升级编译器组件版本:通过NuGet将
Microsoft.CodeDom.Providers.DotNetCompilerPlatform升级到最新稳定版(2.x/3.x均可),新版本已经修复了进程驻留的相关bug,重新发布后即可解决频繁启动进程的问题。 - 预编译站点:如果你的站点没有运行时动态修改aspx、cshtml等文件的需求,可以在发布时勾选预编译站点选项,提前编译所有动态资源,运行时不需要再调用编译器,从根源上避免该问题。
- 同步IIS应用池配置:将慢实例的应用池所有配置完全替换为正常实例的配置,确认.NET Framework版本、32位应用启用状态、进程标识、回收规则、闲置超时时间完全一致后重启站点。
内容的提问来源于stack exchange,提问作者Tonick
相关产品推荐
相关产品推荐

