簡體   English   中英

windows 服務在 windows 7 上工作,但不在 windows 服務器 2003 上

[英]windows service working on windows 7 but not on windows server 2003

解決問題見我的帖子底部。

所以我有一個簡單的 windows 服務,它監視特定文件夾並使用 web 服務將進入其中的文件上傳到服務器。

使用 windows 7 在我的機器上運行良好,但是當我嘗試在 windows 服務器 2003 上啟動它時,我收到一個錯誤:錯誤 1053:服務沒有及時響應啟動或控制請求。 但我在幾秒鍾后收到了這條消息。

我創建了 ServicesPipeTimeout 並將其設置為 60000 毫秒。

我嘗試使用 sc 查詢命令從命令行運行它,發現 WIN32_EXIT_CODE 為 0,我認為這意味着該服務甚至沒有嘗試啟動,因為它在啟動之前發現了一個錯誤。

在事件查看器中,我收到錯誤 7000 和 7009。我是 windows 服務器的管理員。 我唯一沒有嘗試過的是我從微軟找到的一個修補程序,但我不想使用它,因為據我了解,它適用於服務實際超時時。http://support.microsoft.com/ KB/886695

我已經嘗試了我能想到的一切,有什么我想念的嗎?

吉斯利

編輯:重新安裝 .NET 框架,現在我收到一個新錯誤,說找不到服務 controller。

編輯:我使用安裝項目設置服務,而不是使用 installutil 命令。 這是因為我需要在安裝過程中獲取用戶輸入並將其保存在注冊表中。

編輯:我已經安裝了 .NET 4.0 框架,如果不這樣做就無法安裝服務。

除了我上面寫的之外,我還嘗試過:重新啟動。 重新安裝。 我試圖更改服務需要訪問的文件的權限。 在注冊表編輯器中更改權限。 編輯代碼以便 onStart function 只啟動一個線程。

我認為這是某種權限問題,但我沒有太多處理 Windows 服務器的經驗。

解決方案:原來是兩個獨立的問題。 必須修復 .NET 框架,我必須刪除啟動服務時的 try/catch 子句。 由於某種原因(我不知道),try catch 塊做了一些事情,導致無法在 windows 服務器 2003 中啟動服務,但它在 windows 7 上運行良好。

知道這是為什么會很有趣。

感謝所有的幫助。

吉斯利

您是否在 Server 2003 PC 上安裝了正確版本的 .NET 框架? Windows 7 的標准配置需要在較舊的操作系統上手動安裝。

你說“我已經嘗試了我能想到的一切”。 請編輯問題以顯示您已經嘗試過的內容,因此我們不建議您已經做過的事情。

編輯:也試試Fusion Log viewer 將其設置為記錄故障,然后啟動您的服務。 點擊刷新然后查看是否記錄了任何錯誤。 雙擊一行以獲取更多詳細信息。

我猜您使用 .NET 2.0 安裝了 .NET 3.5 服務? InstallUtil 將工作,因為 CLR 相同,但由於 .NET 3.5 依賴項,服務不會啟動。

也可以看看:

如何安裝 .NET 3.5 開發的 Windows 服務?

在您的OnStart代碼中,您可以將所有內容包裝在try-catch塊中,並使用以下內容將異常消息和堆棧跟蹤寫入文件:

File.WriteAllText(@"C:\Temp\MyServiceLog.txt", exp.Message + exp.StackTrace);

這將幫助您分析問題。 此外,我正在使用一種非常簡單的方法來調試我的服務:如果 session 是交互式的,我會將它們包裝在 WinForms 包裝器中。 為此,我需要以下內容:

  1. 創建服務實例的表單 class
  2. 我的服務 class 中的新方法DoStartDoStop ,它們是公共的並調用受保護的OnStartOnStop方法
  3. 上面表單的OnLoadOnClose處理程序中的新代碼,因此相應地調用了服務實例的DoStartDoStop方法

然后我將以下代碼添加到Program.csMain方法中:

if (Environment.UserInteractive)
{
    Application.Run(new FormServiceHoster());
}
else
{
    // ... old code to create service instance.
}

這樣,當您在 Visual Studio 中按 F5 或雙擊資源管理器中的 EXE 時,您就可以讓“服務”作為應用程序運行。 當服務實際作為服務運行時,表單代碼將被忽略。

通常您可以通過附加到進程來調試服務,但是,這對於調試啟動和停止代碼不起作用。 這種方法有助於調試服務啟動和停止代碼。

您需要手動添加對System.Windows.FormsSystem.Drawing的引用。

這就是我敢打賭你希望你使用了一些日志記錄 package 之類的 log4net,這可能有助於判斷你的程序有多遠。

OnStart 事件中的代碼是否可能實際花費的時間比您預期的要長。 如果是這樣,您可以將該代碼移動到一個線程,以便 OnStart 事件完成(因此 Windows 認為該服務已啟動)同時您的線程繼續工作。

您是否以管理員身份運行該服務? 如果是這樣,那通常排除權限問題。 (如果仍然出錯,它將排除 KB 886695 問題,因為這似乎只適用於本地系統)。

由於您使用的是 .NET 4.0,您確定安裝的是完整版本,而不是客戶端配置文件,或者您的應用程序與客戶端配置文件一起使用?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM