Simple Injection强制重启后失效,求无需手动清理的解决方案
解决Simple Injection在Web.Config修改/网站重启后失效的问题
我之前也碰到过几乎一模一样的情况!当时折腾了好一阵才找到根源,下面是我总结的几个可行解决方案:
一、应用启动时自动清理过期缓存
最省心的办法是在应用启动阶段自动检查并清理旧的PluginCache文件,避免加载过期的缓存数据。你可以在Global.asax的Application_Start方法里加入这段逻辑:
protected void Application_Start() { var pluginCacheDir = Server.MapPath("~/App_Data/Temp/PluginCache"); if (Directory.Exists(pluginCacheDir)) { // 获取当前程序集的最后修改时间,用来判断缓存是否过期 var mainAssembly = Assembly.GetExecutingAssembly(); var assemblyLastUpdated = File.GetLastWriteTimeUtc(mainAssembly.Location); // 遍历缓存文件,删除早于程序集更新时间的文件 foreach (var cacheFile in Directory.GetFiles(pluginCacheDir)) { var cacheFileLastUpdated = File.GetLastWriteTimeUtc(cacheFile); if (cacheFileLastUpdated < assemblyLastUpdated) { File.Delete(cacheFile); } } } // 正常初始化Simple Injection容器 var container = new Container(); // ... 你的依赖注入配置代码 }
这样每次应用重启(包括修改web.config触发的重启)都会自动清理过期缓存,不用再手动删除文件夹和执行iisreset。
二、调整Simple Injection的缓存策略
如果你用了Simple Injection的插件扩展(比如SimpleInjector.Extensions.Plugins),可以检查一下是否有缓存相关的配置项,让它在程序集变化时自动失效缓存。比如有些场景下,你可以配置容器调整缓存规则:
var container = new Container(); // 示例:禁用动态代理程序集缓存(生产环境谨慎使用,建议先测试验证) container.Options.EnableDynamicProxyAssemblyCache = false;
注意:这个配置需要根据你使用的Simple Injection版本和插件情况调整,建议结合官方文档确认对应的缓存配置项。
三、自动化重启流程(适合手动运维场景)
如果你们经常需要手动重启网站,可以写一个简单的批处理脚本,把清理缓存和重启IIS的步骤整合在一起,避免遗漏:
@echo off set "WebsitePath=C:\YourWebsiteRootDirectory" rmdir /s /q "%WebsitePath%\App_Data\Temp\PluginCache" iisreset echo 缓存清理完成,IIS已重启 pause
每次需要重启时运行这个脚本即可,不用手动操作两步。
四、检查文件夹权限
有时候缓存失效是因为应用池账号没有足够的权限写入PluginCache文件夹,导致重启后无法生成新的缓存文件,只能加载旧的失效缓存。你可以:
- 找到
App_Data/Temp/PluginCache文件夹 - 右键→属性→安全选项卡
- 确保应用池的身份账号(比如
IIS AppPool\YourAppPoolName)拥有读取、写入、修改权限
这样重启时应用就能正常生成新的缓存文件,不会再加载旧数据。
内容的提问来源于stack exchange,提问作者Julien Kulker
相关产品推荐
相关产品推荐

