.NET项目IIS部署遇ERROR_FILE_IN_USE:Lato-Bold.ttf文件被锁求助
解决iText5字体文件锁定导致的.NET IIS部署失败问题
问题根源在于静态BaseFont实例长期持有字体文件句柄,静态成员会在应用程序域生命周期内持续存在,导致Lato-Bold.ttf文件始终被锁定,无法在部署时替换。以下是具体解决建议:
方法1:改用流加载字体并避免静态实例
不要直接通过文件路径创建BaseFont,而是先将字体文件读入内存流,再从流创建实例,这样文件句柄会被及时释放。同时避免使用静态字段,改用按需创建逻辑(可结合缓存优化性能):
// 按需创建常规字体 private BaseFont GetLatoRegularFont() { var fontPath = HttpContext.Current.Server.MapPath("/assetsui/Fonts/Lato/Lato-Regular.ttf"); using (var fs = new FileStream(fontPath, FileMode.Open, FileAccess.Read)) { return BaseFont.CreateFont(fontPath, BaseFont.CP1252, BaseFont.EMBEDDED, false, fs, null); } } // 按需创建粗体字体 private BaseFont GetLatoBoldFont() { var fontPath = HttpContext.Current.Server.MapPath("/assetsui/Fonts/Lato/Lato-Bold.ttf"); using (var fs = new FileStream(fontPath, FileMode.Open, FileAccess.Read)) { return BaseFont.CreateFont(fontPath, BaseFont.CP1252, BaseFont.EMBEDDED, false, fs, null); } }
若担心重复创建影响性能,可使用MemoryCache缓存BaseFont实例并设置合理过期时间,确保部署前缓存能被回收。
方法2:启用Web Deploy的AppOffline规则
在发布配置中启用AppOffline规则,部署时Web Deploy会自动生成app_offline.htm,强制IIS回收应用池释放文件锁,部署完成后自动移除该文件:
- Visual Studio发布配置中,找到「文件发布选项」勾选「启用AppOffline规则」
- 或在
pubxml配置文件中添加:
<PropertyGroup> <EnableMSDeployAppOffline>True</EnableMSDeployAppOffline> </PropertyGroup>
方法3:部署前手动回收应用池
若不想修改代码,可在部署前手动回收目标站点的应用池:
- 打开IIS管理器,找到对应应用池右键点击「回收」,完成后再执行部署
- 或用命令行自动化操作:
%systemroot%\system32\inetsrv\appcmd recycle apppool /apppool.name:"你的应用池名称"
方法4:将字体嵌入程序集资源
把字体文件嵌入程序集,从资源流加载,彻底避免文件系统锁定:
- 将
Lato-Bold.ttf添加到项目,设置「生成操作」为「嵌入的资源」 - 通过程序集资源流加载字体:
protected static BaseFont bfBold; static YourPdfClass() { var assembly = Assembly.GetExecutingAssembly(); using (var stream = assembly.GetManifestResourceStream("YourNamespace.assetsui.Fonts.Lato.Lato-Bold.ttf")) { bfBold = BaseFont.CreateFont("Lato-Bold.ttf", BaseFont.CP1252, BaseFont.EMBEDDED, false, stream, null); } }
注意替换YourNamespace为实际项目命名空间,确保资源路径正确。
内容的提问来源于stack exchange,提问作者Umberto Leone
相关产品推荐
相关产品推荐

