You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 3.1 MVC应用部署为Windows服务时SQLite数据库无法访问求助

解决Windows服务下SQLite数据库找不到的问题

我之前部署.NET Core应用到Windows服务时也踩过这个坑,核心问题很明确:Windows服务默认的工作目录不是你的exe所在文件夹,它默认会把C:\Windows\System32当作工作目录,而你的SQLite数据库文件肯定在发布文件夹里,所以应用自然找不到它。下面给你几个实用的解决办法:

方法1:修改服务的工作目录(最推荐)

Windows服务本身没有直接通过sc命令设置工作目录的参数,得通过注册表来配置:

  1. 先停止当前运行的服务:
    sc stop RazService
    
  2. 打开注册表编辑器(按下Win+R输入regedit回车),导航到路径:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RazService
  3. 在右侧右键新建一个字符串值,命名为WorkingDirectory,把值设置为你的exe所在的完整文件夹路径(比如D:\MyRazorApp\Publish)
  4. 重启服务:
    sc start RazService
    

这样服务启动后就会在你指定的目录下运行,自然能找到同目录的数据库文件了。

方法2:在代码中动态指定数据库绝对路径

如果你不想碰注册表,可以修改代码,让应用始终从自身所在目录加载数据库:

  1. 找到你的数据库连接字符串配置(一般在appsettings.json或者代码里),原来的相对路径写法类似:
    "ConnectionStrings": {
      "DefaultConnection": "Data Source=app.db"
    }
    
  2. 改成用代码动态拼接绝对路径,比如在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)这个工具,它能可视化配置服务的所有参数:

  1. 下载nssm(体积很小,直接搜索即可获取),把它放到你的发布文件夹或者系统环境变量的路径里
  2. 打开命令行,切换到发布文件夹,运行:
    nssm install RazService
    
  3. 在弹出的配置窗口里:
    • Path选择你的Raz.exe文件
    • Working Directory选择exe所在的发布文件夹
    • 其他选项比如服务名称、启动类型可以按需设置
  4. 点击Install service完成安装,之后直接启动服务即可

最后还要确认两个小细节:

  • 你的SQLite数据库文件app.db确实在发布文件夹里(发布时要确保它被设置为“复制到输出目录”)
  • Windows服务默认用LocalSystem账户运行,要确保这个账户有访问发布文件夹的权限(一般默认没问题,但如果是自定义路径可能需要手动设置读写权限)

内容的提问来源于stack exchange,提问作者dgd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:37:53