如何在IIS遗留子应用中禁用Roslyn编译器并保留应用身份
解决IIS子应用禁用Roslyn同时保留应用身份的方案
我之前处理过好几个类似的IIS配置场景,这里有两个靠谱的方案能帮你解决问题——既让遗留应用禁用Roslyn,又完全保留它的独立IIS应用身份:
方案1:使用站点级web.config的<location>元素定向覆盖配置
这是最直接的方式,不需要修改子应用的任何文件,完全在站点根级的web.config里配置,精准针对遗留应用生效。
具体做法是在站点根web.config的<configuration>节点下添加一个<location>节点,指定你的遗留子应用的虚拟路径,然后在里面重置编译相关配置,替换掉Roslyn编译器:
<configuration> <!-- 站点原有的其他配置内容 --> <location path="你的遗留应用虚拟路径" allowOverride="false"> <system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4"> <providerOption name="CompilerVersion" value="v4.0"/> <providerOption name="WarnAsError" value="false"/> </compiler> <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4"> <providerOption name="CompilerVersion" value="v4.0"/> <providerOption name="OptionInfer" value="true"/> <providerOption name="WarnAsError" value="false"/> </compiler> </compilers> </system.codedom> </location> </configuration>
- 细节说明:
path属性填写你的遗留子应用虚拟路径(比如子应用路径是/LegacyApp,就填LegacyApp);allowOverride="false"可以确保子应用即使有自己的web.config,也无法覆盖这个禁用Roslyn的配置,刚好匹配你“无法修改应用下web.config”的限制;- 这里用的是.NET Framework默认的CodeProvider,直接替换了站点级配置中的Roslyn编译器(通常是
Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider)。
方案2:通过IIS管理器的配置编辑器可视化设置
如果你不习惯手动编辑XML,也可以用IIS的可视化界面操作:
- 打开IIS管理器,选中你的站点根节点;
- 找到并打开「配置编辑器」;
- 在「节」下拉菜单中选择
system.codedom/compilers; - 点击右侧的「定位到」,在弹出对话框中输入遗留子应用的路径,点击确定;
- 此时你看到的就是该子应用的编译配置,直接修改对应的编译器类型为默认的.NET CodeProvider,保存配置即可;
- 最后记得回收子应用的应用池,让新配置生效。
关键注意事项
- 这个配置不会影响子应用的应用池身份设置,只要你的子应用原本是独立的应用身份,修改后依然保留;
- 修改完成后必须回收子应用的应用池或重启站点,确保新的编译配置被加载;
- 可以通过测试子应用的页面编译情况,或者查看运行时日志,验证Roslyn是否已经被成功禁用。
内容的提问来源于stack exchange,提问作者BlackICE
相关产品推荐
相关产品推荐

