【问题标题】:windows service working on windows 7 but not on windows server 2003Windows 服务在 Windows 7 上工作,但在 Windows Server 2003 上不工作
【发布时间】:2011-09-11 13:56:51
【问题描述】:

已解决问题,请参阅我的帖子底部。

所以我有一个简单的 Windows 服务,它监视特定文件夹并使用 Web 服务将进入其中的文件上传到服务器。

它在我使用 windows 7 的机器上运行良好,但是当我尝试在 windows server 2003 上启动它时,我收到一个错误:错误 1053:服务没有及时响应启动或控制请求。但我在几秒钟后就收到了这条消息。

我创建了 ServicesPipeTimeout 并将其设置为 60000 毫秒。

我尝试使用 sc query 命令从命令行运行它,发现 WIN32_EXIT_CODE 为 0,我认为这意味着该服务甚至没有尝试启动,因为它在启动之前发现了一个错误。

在事件查看器中,我收到错误 7000 和 7009。 我是 windows 服务器的管理员。 我唯一没有尝试过的是我从 microsoft 找到的修补程序,但我不想使用它,因为据我了解,它适用于服务实际超时的情况。http://support.microsoft.com/ KB/886695

我已经尝试了所有我能想到的东西,还有什么我缺少的吗?

吉斯利

编辑:重新安装 .NET 框架,现在我收到一个新错误,说找不到服务控制器。

编辑:我使用安装项目设置服务,而不是使用 installutil 命令。这是因为我需要在安装过程中获取用户输入并将其保存在注册表中。

编辑:我已经安装了 .NET 4.0 框架,如果不这样做就无法安装服务。

除了我上面写的之外,我还尝试过: 重新启动。 重新安装。 我试图更改服务需要访问的文件的权限。 在注册表编辑器中更改权限。 修改代码,使 onStart 函数只启动一个线程。

我认为这是某种权限问题,但我没有太多处理 Windows 服务器的经验。

解决方案: 原来是两个独立的问题。 .NET 框架必须修复,我必须删除启动服务时的 try/catch 子句。由于某种原因(我不知道),try catch 块做了一些事情,导致无法在 windows server 2003 中启动服务,但它在 windows 7 上运行良好。

知道这是为什么会很有趣。

感谢大家的帮助。

吉斯利

【问题讨论】:

  • 当您的服务的OnStart 事件处理程序中引发异常时,会出现此消息。请参阅我的答案以获取可能的解决方案。

标签: c# .net windows-services timeout windows-server-2003


【解决方案1】:

您是否在 Server 2003 PC 上安装了正确版本的 .NET Framework? Windows 7 的标准配置需要在较旧的操作系统上手动安装。

你说“我已经尝试了我能想到的一切”。请编辑问题以显示您已经尝试过的内容,因此我们不会建议您已经做过的事情。

编辑: 也试试Fusion Log viewer。将其设置为记录故障,然后启动您的服务。点击刷新然后查看是否记录了任何错误。双击一行以了解更多详细信息。

【讨论】:

  • 服务器上两个都没有。
  • @Gisli,它不是标准文件。它可能在您的开发 PC 上,否则您需要下载 Windows SDK。
【解决方案2】:

我猜您使用 .NET 2.0 安装了 .NET 3.5 服务?由于 CLR 相同,因此 InstallUtil 可以工作,但由于 .NET 3.5 依赖关系,该服务无法启动。

另见:

How to install a Windows service developed in .NET 3.5?

【讨论】:

  • 我正在使用一个安装项目,所以我必须在安装过程中安装 .net 4.0 框架。
【解决方案3】:

在您的 OnStart 代码中,您可以将所有内容包装在 try-catch 块中,并使用以下内容将异常消息和堆栈跟踪写入文件:

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

这将帮助您分析问题。此外,我正在使用一种非常简单的方法来调试我的服务:如果会话是交互式的,我会将它们包装在 WinForms 包装器中。为此,我需要以下内容:

  1. 创建服务类实例的表单
  2. 我的服务类中的新方法 DoStartDoStop,它们是公共的,并调用受保护的 OnStartOnStop 方法
  3. 上面表单的OnLoadOnClose处理程序中的新代码,因此服务实例的DoStartDoStop方法被相应地调用

然后我将以下代码添加到Program.cs中的Main方法中:

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

这样,当您在 Visual Studio 中按 F5 或在资源管理器中双击 EXE 时,您就可以让“服务”作为应用程序运行。当服务实际作为服务运行时,表单代码将被忽略。

通常您可以通过附加到进程来调试服务,但是,这不适用于调试启动和停止代码。这种方法对调试服务启动和停止代码有很大帮助。

您需要手动添加对System.Windows.FormsSystem.Drawing 的引用。

【讨论】:

  • 看起来我在执行过程中还没有走那么远。我开始认为在系统尝试启动服务之前执行了检查失败。
  • 服务器上可能缺少 dll。您是否使用任何非框架库并且其中任何一个都依赖于其他 dll。
  • 好吧,然后将您的整个代码包装在Program.cs 中的try-catch-block 中,并将异常写入文件中,如我的回答中所述。这不是输出有用的东西吗?
【解决方案4】:

这就是我打赌你希望你使用了一些日志包,比如 log4net,这可能有助于判断你的程序能走多远。

是否有可能 OnStart 事件中的代码实际上花费的时间比您预期的要长。如果是这样,您可以将该代码移动到一个线程中,以便在您的线程继续工作的同时完成 OnStart 事件(因此 Windows 认为该服务已启动)。

您是否以管理员身份运行该服务?如果是这样,那通常排除权限问题。 (如果仍然出错,它将排除 KB 886695 问题,因为这似乎只适用于本地系统。

由于您使用的是 .NET 4.0,您确定安装的是完整版本而不是客户端配置文件,或者您的应用程序可以与客户端配置文件一起使用吗?

【讨论】:

  • 1.超时发生在不到 1 秒后。 2. onStart方法只是启动一个线程,什么都不做。
猜你喜欢
  • 2019-02-09
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 2014-08-01
  • 1970-01-01
  • 2015-01-30
相关资源
最近更新 更多