.NET Core 3.1 MVC应用部署为Windows服务时SQLite数据库无法访问求助
解决Windows服务下SQLite数据库找不到的问题
我之前部署.NET Core应用到Windows服务时也踩过这个坑,核心问题很明确:Windows服务默认的工作目录不是你的exe所在文件夹,它默认会把C:\Windows\System32当作工作目录,而你的SQLite数据库文件肯定在发布文件夹里,所以应用自然找不到它。下面给你几个实用的解决办法:
方法1:修改服务的工作目录(最推荐)
Windows服务本身没有直接通过sc命令设置工作目录的参数,得通过注册表来配置:
- 先停止当前运行的服务:
sc stop RazService - 打开注册表编辑器(按下Win+R输入
regedit回车),导航到路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RazService - 在右侧右键新建一个字符串值,命名为
WorkingDirectory,把值设置为你的exe所在的完整文件夹路径(比如D:\MyRazorApp\Publish) - 重启服务:
sc start RazService
这样服务启动后就会在你指定的目录下运行,自然能找到同目录的数据库文件了。
方法2:在代码中动态指定数据库绝对路径
如果你不想碰注册表,可以修改代码,让应用始终从自身所在目录加载数据库:
- 找到你的数据库连接字符串配置(一般在
appsettings.json或者代码里),原来的相对路径写法类似:"ConnectionStrings": { "DefaultConnection": "Data Source=app.db" } - 改成用代码动态拼接绝对路径,比如在
Program.cs或者Startup.cs里:var dbPath = Path.Combine(AppContext.BaseDirectory, "app.db"); services.AddDbContext<ApplicationDbContext>(options => options.UseSqlite($"Data Source={dbPath}"));
这样不管服务的工作目录是什么,应用都会从自身发布目录找数据库文件,灵活性更高。
方法3:用nssm工具创建服务(更省心的可视化方式)
如果觉得命令行和注册表太麻烦,可以用nssm(Non-Sucking Service Manager)这个工具,它能可视化配置服务的所有参数:
- 下载nssm(体积很小,直接搜索即可获取),把它放到你的发布文件夹或者系统环境变量的路径里
- 打开命令行,切换到发布文件夹,运行:
nssm install RazService - 在弹出的配置窗口里:
Path选择你的Raz.exe文件Working Directory选择exe所在的发布文件夹- 其他选项比如服务名称、启动类型可以按需设置
- 点击
Install service完成安装,之后直接启动服务即可
最后还要确认两个小细节:
- 你的SQLite数据库文件
app.db确实在发布文件夹里(发布时要确保它被设置为“复制到输出目录”) - Windows服务默认用
LocalSystem账户运行,要确保这个账户有访问发布文件夹的权限(一般默认没问题,但如果是自定义路径可能需要手动设置读写权限)
内容的提问来源于stack exchange,提问作者dgd
相关产品推荐
相关产品推荐

