2013-01-08 48 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);