.NET 9 Blazor Web App部署IIS后无法访问SQLite数据库求助
一、解决SQLite Error 14(无法打开数据库文件)
这个错误90%以上是路径错误或权限不足导致,以下是你可能遗漏的操作:
强制使用绝对路径配置连接字符串
调试时相对路径(如Data Source=Data/MyDb.db)能正常工作,但IIS的工作目录并非站点根目录,会导致路径解析错误。修改appsettings.json或appsettings.Production.json的连接字符串为绝对路径:"ConnectionStrings": { "BlazorWebAppAdminContext": "Data Source=C:\\inetpub\\wwwroot\\YourBlazorApp\\Data\\MyDb.db" }或者在代码中动态拼接绝对路径(更灵活):
var dbPath = Path.Combine(AppContext.BaseDirectory, "Data", "MyDb.db"); builder.Services.AddDbContext<BlazorWebAppAdminContext>(options => options.UseSqlite($"Data Source={dbPath}"));给应用池身份授予完整权限
如果你用的是默认的ApplicationPoolIdentity,仅添加IIS_IUSRS和IUSR权限不够,需要给应用池专属虚拟账户授权:- 右键数据库所在文件夹 → 属性 → 安全 → 编辑 → 添加
- 在“输入对象名称”中输入
IIS AppPool\[你的应用池名称](比如IIS AppPool/BlazorWebAppPool) - 授予该账户读取、写入、修改权限,应用到文件夹及所有子文件
检查父文件夹权限
SQLite需要遍历数据库文件的父路径,确保从站点根目录到Data文件夹的每一层父目录,都给上述应用池账户或IIS_IUSRS授予读取权限
二、解决“未应用的迁移”问题
这个问题通常和SQLite Error 14关联,因为迁移执行失败才会提示未应用:
手动执行迁移命令
在服务器上打开命令提示符,切换到你的站点发布目录,执行以下命令(确保服务器已安装.NET 9 SDK):dotnet ef database update --context BlazorWebAppAdminContext如果没有安装SDK,可以在本地生成迁移SQL脚本,再用SQLite工具(如SQLite Studio)执行:
dotnet ef migrations script --context BlazorWebAppAdminContext -o migrations.sql确认迁移代码在部署时被正确包含
检查项目文件(.csproj)是否包含迁移相关文件:<ItemGroup> <Compile Include="Migrations\**" /> <EmbeddedResource Include="Migrations\**\*.resx" /> </ItemGroup>验证连接字符串一致性
确保调试环境和生产环境的BlazorWebAppAdminContext连接字符串完全一致,避免指向不同的数据库文件
三、遗漏的IIS配置检查
设置应用池为“无托管代码”
打开IIS管理器 → 应用池 → 选择你的应用池 → 高级设置 → 将“.NET CLR版本”设置为无托管代码(Blazor Web App基于ASP.NET Core,不需要传统.NET CLR托管)确认ASP.NET Core托管捆绑包安装正确
虽然你升级了托管包,但要确保Windows Server 8.5上安装的是对应.NET 9版本的ASP.NET Core托管捆绑包,且IIS的ASP.NET Core模块已启用排查文件锁定问题
重启应用池,或者用Process Explorer工具检查数据库文件是否被其他进程(如之前的IIS Worker Process)占用,释放后再重新部署
四、是否为.NET 9 Bug?
目前来看,这类问题绝大多数是配置或环境权限问题,并非.NET 9或SQLite的官方Bug。如果上述所有步骤都验证通过仍无法解决,可以去dotnet/efcore或dotnet/aspnetcore的GitHub仓库搜索同类Issue,确认是否存在特定场景下的兼容性问题,但概率极低。
内容的提问来源于stack exchange,提问作者DevQt

