如何避免无代码后置的UserControl被IIS重复编译?
问题描述
- 环境:ASP.NET Framework 4.7.2、IIS 8.5
- 架构:通过无代码后置的UserControl(ascx内嵌入服务器端脚本)渲染内容,无需更新bin文件即可修改页面内容
- 问题:修改单个UserControl后,IIS会重新编译大量其他UserControl(
%SYSTEMROOT%\Microsoft.NET\Framework[64]<vernum>\Temporary ASP.NET Files目录下大量文件更新),网站需2-3分钟才能恢复正常服务 - 已尝试操作:禁用fcnMode,问题未解决
示例UserControl代码:
<%@ Control Language="C#" AutoEventWireup="true" EnableViewState="false" Inherits="Comito.CMS.FrontEndShared.Templates.BaseUserControl" %> <script runat="server"> protected void Page_Load(object sender, EventArgs e) { var basePage = (Comito.CMS.FrontEndShared.Templates.BasePage)Page; if (basePage.Document != null) { Comito.CMS.Domain.Entity.Document.Document Document = basePage.Document; LitTitle.Text = Document.Title; } } </script> <asp:Literal id="LitTitle" runat="server"></asp:Literal>
解决方案
1. 强制UserControl独立编译
在web.config的<system.web>节点下修改编译配置,关闭批处理编译,让每个UserControl单独编译,避免牵一发而动全身:
<system.web> <compilation debug="false" batch="false" maxBatchSize="1" maxBatchGeneratedFileSize="1024"> <!-- 保留原有其他编译配置 --> </compilation> </system.web>
注意:生产环境务必保持debug="false",debug模式下虽默认关闭批处理,但显式配置更稳妥。
2. 优化临时编译文件目录
把ASP.NET临时编译目录转移到性能更好的磁盘(比如非系统盘),减少IO瓶颈导致的编译延迟。在web.config中修改:
<compilation tempDirectory="D:\ASP.NET_Temp\MyCMS" batch="false"> </compilation>
可通过应用程序池回收定期清理旧的临时文件,不要在网站运行时手动删除。
3. 降低控件间的依赖耦合
检查BaseUserControl是否存在大量全局静态依赖或不必要的引用,导致所有继承它的UserControl都被关联编译。建议:
- 拆分基类功能,只保留通用基础逻辑
- 改用依赖注入按需获取服务,避免在基类中直接引用全局静态资源
4. 启用增量预编译
提前编译UserControl,减少运行时编译压力。使用以下命令执行增量预编译:
aspnet_compiler -v /YourCMS -p C:\Path\To\YourCMS -u C:\Path\To\PrecompiledSite
预编译后部署到IIS,后续修改单个UserControl时,只需重新编译该控件并替换到预编译目录,不会触发全局编译。
5. 确认FCN完全禁用
检查web.config中FCN的配置是否正确,确保IIS不会因文件变动触发不必要的编译:
<system.web> <httpRuntime fcnMode="Disabled" /> </system.web>
同时在IIS站点的“高级设置”中关闭“启用文件更改通知”。
内容的提问来源于stack exchange,提问作者user2435866
相关产品推荐
相关产品推荐

