如何正确移除已发布ASP.NET WebForms项目中的.cs文件
问题根因
该现象本质是旧版ASP.NET WebForms站点发布时,对应目录下的页面/用户控件未完成全量预编译,站点处于动态编译+预编译程序集混用状态:IIS运行时检测到路径下存在.cs源码文件时,会优先走动态编译逻辑,直接删除源码后运行时找不到编译依赖,就会抛出异常导致站点无法运行。
正确删除.cs文件的操作步骤
- 第一步:本地打开项目,找到对应目录下所有
.aspx、.ascx文件,查看顶部的页面/控件声明头,将其中的CodeFile属性全部替换为CodeBehind属性,同时确认Inherits属性填写的完整类名(包含命名空间)和编译生成的dll中的类完全匹配。
例如原动态编译模式的声明为:
需要修改为预编译模式的声明:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="index" %><%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="YourAppName.index" %> - 第二步:重新编译整个项目,确认编译无报错,拿到最新生成的dll程序集,以及修改完声明头的
.aspx、.ascx文件备用。 - 第三步:登录服务器操作IIS,先回收对应站点的应用程序池,解除站点对文件的占用;随后清理ASP.NET动态编译缓存,根据站点使用的.NET版本和程序位数,打开对应路径(.NET 4.0/4.5+ 64位站点默认路径为
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files,32位站点将路径中Framework64替换为Framework即可),删除和当前站点对应的所有缓存文件夹,避免旧编译配置干扰运行。 - 第四步:将本地修改好的
.aspx、.ascx文件和最新编译的dll上传到站点发布目录,完成全量覆盖后,再删除目录下留存的所有.cs源码文件。 - 第五步:重启站点,逐个访问对应目录下的页面验证功能,如果出现类找不到的报错,回头核对对应页面
Inherits属性的类名、命名空间是否和dll中的类完全一致,排查是否有遗漏修改CodeFile属性的页面/控件文件。
补充说明:如果后续发布需要彻底避免源码残留,可在Visual Studio执行发布操作时,在预编译设置中勾选「不允许更新预编译站点」、「为每个页面和控件生成固定命名程序集」选项,发布完成后站点目录不会留存任何
.cs源码文件,后续更新仅需替换对应dll即可,不会再出现删源码导致站点崩溃的问题。
内容的提问来源于stack exchange,提问作者QSan
相关产品推荐
相关产品推荐

