Windows服务在Windows 7上工作但在Windows Server 2003上没有

时间:2011-06-09 10:10:07

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

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

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

使用Windows 7在我的机器上正常工作但是当我尝试在Windows Server 2003上启动它时,我收到一个错误:错误1053:服务没有及时响应启动或控制请求。但是我在几秒钟之后收到了这条消息。

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

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

在事件查看器中,我收到错误7000和7009。 我是Windows服务器上的管理员。 我唯一没试过的是从微软发现的修补程序,但是我不想使用它,因为据我所知,它适用于服务实际超时的时候.http://support.microsoft.com/ KB / 886695

我已经尝试过我能想到的一切,有什么我想念的吗?

吉斯利

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

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

编辑:我已经安装了.NET 4.0框架,但不可能安装该服务。

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

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

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

知道这是为什么会非常有趣。

感谢您的帮助。

Gísli

4 个答案:

答案 0 :(得分:1)

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

你说“我已经尝试了我能想到的一切”。请编辑问题以显示您已经尝试过的内容,这样我们就不会建议您已经完成的任务。

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

答案 1 :(得分:0)

我猜你用.NET 2.0安装了.NET 3.5服务? InstallUtil将起作用,因为CLR是相同的,但由于.NET 3.5依赖性,服务无法启动。

另见:

  

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

答案 2 :(得分:0)

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

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

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

  1. 创建服务类实例的表单
  2. 我的服务类中的新方法DoStartDoStop,这些方法是公开的并调用受保护的OnStartOnStop方法
  3. 上述表单的OnLoadOnClose处理程序中的新代码,因此相应调用服务实例的DoStartDoStop方法
  4. 然后,我将以下代码添加到Main中的Program.cs方法:

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

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

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

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

答案 3 :(得分:0)

我敢打赌你希望你曾经使用过像log4net这样的日志包,这可能有助于说明你的程序有多远。

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

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

由于您使用的是.NET 4.0,您确定是安装完整版本而不是客户端配置文件,还是您的应用程序使用客户端配置文件?