2013-01-08 46 views
2

我创建了一个Windows服务为我管理一些文件。为了进行调试,我编写了一个控制台入口点,所以我的实际服务代码与windows服务是分开的一个类。我使用的是的SQLite DB用流利的NHibernate的存储设置等Windows服务没有看到文件

当我运行控制台模式,它完美的作品,但尝试启动它不会进程时。我在开始进行调试时发现,当NHibernate尝试创建会话时,即使它存在,它也不能看到数据库文件。

我已经设置了以管理员身份运行的进程,并且还尝试将其作为启用了“Allow access to desktop”的本地系统帐户运行,但仍不会拾取数据库文件。这意味着NHibernate无法加载文件,因此它会创建一个新文件,并且当我的服务试图从数据库加载数据时,它会失败,因为它加载了空白数据库文件。

+0

配置文件是否在正确的位置?是否存在权限问题,例如,从控制台和服务中的本地用户以管理员身份运行? –

+1

您是否检查服务运行的用户?默认情况下,服务与特殊的服务用户一起运行(不过您可以指定一个不同的服务)。如果它作为服务用户运行,则该用户可能对该文件没有足够的访问权限。 – Zarat

+0

不要勾选“允许访问桌面”。第一步是告诉我们该服务运行的用户是什么。 –

回答

1

这可能是一个文件权限问题。检查执行服务的用户是否可以读取/写入数据库文件。

另外,也可以是工作目录的问题: What directory does a Windows Service run in?

您可以使用绝对路径找到该文件。

您可以在启动服务时尽早使用SetCurrentDirectory(),并将它从服务可执行文件的路径中提取。另一方面,通常修改的数据不应该在服务的安装目录中,而是例如改为在ProgramData文件夹下。

app.config仍照常加载,因此可用于根据需要配置任何安装相关路径。

+0

用户我已经设置了运行的过程,因为本地管理员也是数据库文件的所有者。进程文件的位置与进程本身相同。进程和命令行与同一用户的运行方式完全相同,两者之间唯一的区别是进程在控制台模式下无法看到DB文件。 – MrThirsty

1

所以事实证明,即使其中一个特定的文件夹,它是在Windows目录的环境下运行我的程序文件,我已经添加以下代码,现在,它完美的作品:

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);