解决了这个问题,请参阅我文章的底部。
因此,我有一个简单的windows服务,它可以监视特定的文件夹,并使用web服务将进入其中的文件加载到服务器。
它在我使用windows 7的机器上运行良好,但当我试图在windows服务器2003上启动它时,我收到一个错误:错误1053:服务没有及时响应启动或控制请求。但几秒钟后我就收到了这个信息。
我已经创建了ServicesPipeTimeout,并将其设置为60000毫秒。
我尝试使用sc query命令从命令行运行它,发现WIN32_EXIT_CODE为0,我认为这意味着该服务甚至没有尝试启动,因为它在启动之前发现了错误。
在事件查看器中,我得到错误7000和7009。我是windows服务器上的管理员。我唯一没有尝试过的是我从微软找到的一个修补程序,但我不想使用它,因为据我所知,它是在服务真正超时时使用的。http://support.microsoft.com/kb/886695
我已经尝试了我能想到的一切,还有什么我缺少的吗?
Gísli
编辑:重新安装。NET框架,现在我得到了一个新的错误,说找不到服务控制器。
EDIT:我使用安装项目设置服务,而不是使用installutil命令。这是因为我需要在安装过程中获得用户输入,并将其保存在注册表中。
编辑:我已经安装了。NET 4.0框架,不这样做就不可能安装该服务。
除了我上面写的内容,我还尝试过:正在重新启动。重新安装。我已尝试更改服务需要访问的文件的权限。正在更改注册表编辑器中的权限。编辑了代码,使onStart函数只启动一个线程。
我认为这是某种权限问题,但我没有太多处理Windows服务器的经验。
解决方案:结果是两个独立的问题。这个NET框架必须修复,并且我必须删除启动服务时的try/catch子句。由于某种原因(我不知道),try-catch块做了一些事情,使其无法在windows服务器2003中启动该服务,但它在windows7上运行良好。
如果知道为什么会这样,那将是非常有趣的。
谢谢你的帮助。
Gísli
您是否安装了正确版本的。NET Framework在Server 2003 PC上的应用?Windows 7上的标准配置需要手动安装在较旧的操作系统上。
你说"我已经尝试了我能想到的一切"。请编辑问题以显示你已经尝试过的内容,这样我们就不会建议你已经做了什么。
编辑:还可以尝试Fusion Log查看器。将其设置为记录故障,然后启动服务。点击刷新,然后查看是否记录了任何错误。双击一行以获取更多详细信息。
我猜您安装了。NET 3.5服务使用。NET 2.0?InstallUtil将工作,因为CLR是相同的,但服务不会启动,因为。NET 3.5依赖关系。
另请参阅:
如何安装中开发的Windows服务。净3.5?
在OnStart
代码中,您可以将所有内容封装在try-catch
块中,并使用以下方法将异常消息和堆栈跟踪写入文件:
File.WriteAllText(@"C:TempMyServiceLog.txt", exp.Message + exp.StackTrace);
这将帮助您分析问题。此外,我使用了一种非常简单的方法来调试我的服务:如果会话是交互式的,我会将它们包装在WinForms包装器中。为此,我需要以下内容:
- 创建服务类实例的窗体
- 我的服务类中的新方法
DoStart
和DoStop
,它们是公共的,并调用受保护的OnStart
和OnStop
方法 - 上面表单的
OnLoad
和OnClose
处理程序中的新代码,因此相应地调用服务实例的DoStart
和DoStop
方法
然后,我将以下代码添加到Program.cs
中的Main
方法中:
if (Environment.UserInteractive)
{
Application.Run(new FormServiceHoster());
}
else
{
// ... old code to create service instance.
}
这样,当您在Visual Studio中点击F5或在资源管理器中双击EXE时,您就可以将"服务"作为应用程序运行。当服务实际作为服务运行时,Forms代码将被忽略。
通常,您可以通过附加到进程来调试服务,但是,这对于调试启动和停止代码不起作用。此方法在很大程度上有助于调试服务启动和停止代码。
您需要手动添加对System.Windows.Forms
和System.Drawing
的引用。
我敢打赌,这就是你希望使用log4net这样的日志记录包的地方,它可能有助于告诉你的程序能走多远。
是否可能OnStart事件中的代码实际花费的时间比您预期的要长。如果是这样的话,你可以将代码移动到一个线程中,这样OnStart事件就完成了(因此Windows认为服务已经启动),而你的线程继续工作。
你是以管理员身份运行服务吗?如果是这样,通常会排除权限问题。(如果仍然出错,它将排除KB886695问题,因为这似乎只适用于本地系统)。
由于您使用的是.NET 4.0,您是否确定安装了完整版本而不是客户端配置文件,或者您的应用程序与客户端配置文件一起工作?