修改web.config后IIS托管WCF服务HTTPS报错:无法加载程序集App_Web_e_nyphyd
解决WCF服务修改web.config后出现“Could not load file or assembly 'App_Web_xxx'”的问题
老哥,这个问题我太熟了,之前帮好几个做WCF的开发者解决过。本质是IIS动态编译生成的临时程序集和你预编译的WCF服务程序集冲突了——毕竟IIS一检测到web.config变更就会重启应用域,触发动态编译逻辑,结果和预编译的程序集撞车,就出现了找不到临时程序集的错误。结合你的场景(已经配置HTTPS、重新发布能恢复但改配置就复发),给你几个针对性的解决办法:
1. 调整web.config的编译配置,避免动态编译冲突
在web.config的<system.web>节点下,修改或添加<compilation>节点的配置,让IIS减少动态编译的触发,或者指定独立的临时编译目录:
<system.web> <compilation debug="false" batch="true" optimizeCompilations="true" tempDirectory="C:\Temp\WcfServiceCompilation" /> <!-- 其他配置 --> </system.web>
batch="true":让IIS批量编译站点内容,减少零散的临时程序集生成optimizeCompilations="true":避免不必要的重复编译,降低冲突概率tempDirectory:指定一个独立的、权限充足的目录存放临时编译文件,避免和其他站点的临时文件混在一起导致冲突
2. 确保WCF服务是预编译发布的
如果之前是直接把文件复制到IIS(文件系统发布),改成预编译发布就能从根源上减少这个问题:
- 发布时选择“预编译网站”选项,勾选“允许更新预编译站点”(这样后续还能修改web.config)
- 预编译发布后,所有服务逻辑都已经打包成正式程序集,IIS不会再生成
App_Web_xxx这类临时编译文件,自然就不会有冲突了
3. 检查应用程序池的权限与回收设置
- 确保你的应用程序池身份对IIS默认的临时编译目录(
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files)有读写权限,不然IIS生成临时程序集时会失败,导致加载错误 - 修改web.config后,手动回收一次应用程序池,而不是等IIS自动处理——手动回收能让应用域干净重启,避免残留的旧程序集干扰
4. 手动清除IIS临时编译文件
如果上面的方法都没立刻见效,可以手动清理临时文件来解决:
- 停止对应的应用程序池
- 找到路径:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\你的WCF服务应用名称 - 删除该目录下的所有文件和子文件夹
- 重启应用程序池,再访问服务试试
补充说明
为什么修改web.config会触发这个错误?因为IIS对web.config的变更非常敏感,一旦检测到修改就会重启应用域,同时尝试动态编译站点的部分内容生成临时程序集。但你的WCF服务是预编译好的,这两套程序集在加载时发生了冲突,就会抛出找不到App_Web_xxx的错误。重新发布相当于把预编译的程序集重新部署,覆盖了冲突的临时文件,所以能恢复,但改配置又会触发同样的逻辑,导致复发。
内容的提问来源于stack exchange,提问作者hirenpatel
相关产品推荐
相关产品推荐

