繁体   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