当前位置:  开发笔记 > 开发工具 > 正文

错误1053:服务未及时响应启动或控制请求

如何解决《错误1053:服务未及时响应启动或控制请求》经验,为你挑选了6个好方法。

我最近继承了一些作为Windows服务运行的应用程序,并且我在提供gui(可以从系统托盘中的上下文菜单访问)时遇到问题.

我们需要为Windows服务使用gui的原因是为了能够重新配置Windows服务的行为而无需停止/重新启动.

我的代码在调试模式下工作正常,我得到了上下文菜单,一切都行为正常等.

当我使用命名帐户(即非本地系统帐户)通过"installutil"安装服务时,服务运行正常,但不会在系统托盘中显示图标(我知道这是正常行为,因为我没有有"与桌面交互"选项).

这是问题所在 - 当我选择"LocalSystemAccount"选项,并检查"与桌面交互"选项时,该服务需要AGES启动,没有明显的原因,我只是不断得到

无法在本地计算机上启动...服务.

错误1053:服务未及时响应启动或控制请求.

顺便提一下,我通过注册表黑客将Windows服务超时从默认的30秒增加到2分钟(请参阅http://support.microsoft.com/kb/824344,在第3节中搜索TimeoutPeriod),但服务启动仍然超时

我的第一个问题是 - 为什么"本地系统帐户"登录比服务使用非LocalSystemAccount登录时要长得多,导致Windows服务超时?这两者之间的区别在于启动时会产生这种不同的行为吗?

其次 - 退一步,我想要实现的只是一个提供配置gui的Windows服务 - 我很乐意使用非本地系统帐户(带有命名用户/ pwd)运行,如果我可以让服务与桌面交互(也就是说,从系统托盘中提供上下文菜单).这是可能的,如果是这样的话怎么样?

任何指向上述问题的提示都将不胜感激!



1> 小智..:

在打了几天这个消息之后,一位朋友告诉我你必须使用Release版本.当我InstallUtil Debug构建时,它会给出此消息.发布版本开始很好.



2> mdb..:

如果你继续尝试让你的服务直接与用户的桌面交互,你就会失败:即使在最好的情况下(即"在Vista之前"),这也是非常棘手的.

Windows内部管理多个窗口站,每个窗口站都有自己的桌面.分配给在给定帐户下运行的服务的窗口站与登录的交互用户的窗口站完全不同.跨窗口站访问一直是不受欢迎的,因为它存在安全风险,但是之前的Windows版本允许一些例外,这些已经在Vista和更高版本的操作系统中被淘汰.

服务在启动时挂起的最可能原因是因为它试图与不存在的桌面进行交互(或假设Explorer在系统用户会话中运行,也不是这种情况),或等待来自不可见桌面的输入.

解决这些问题的唯一可靠方法是从服务中删除所有UI代码,并将其移动到在交互式用户会话内运行的单独可执行文件(例如,可以使用全局启动组启动可执行文件).

UI代码和服务之间的通信可以使用任何RPC机制实现:命名管道特别适用于此目的.如果您的通信需求很少,则使用应用程序定义的服务控制管理器命令也可能会起作用.

实现UI和服务代码之间的这种分离需要一些努力:然而,这是使事情可靠地工作的唯一方法,并且将来会很好地为您服务.

附录,2010年4月:由于这个问题仍然非常流行,这里有一种方法可以解决导致"服务没有响应..."错误的另一种常见情况,涉及.NET服务,不会尝试任何有趣的东西,如与桌面交互,但使用Authenticode签名程序集:通过在.exe.config文件中添加以下元素,在加载时禁用Authenticode签名验证以创建Publisher证据:


    
        
    

发布者证据是一种很少使用的代码访问安全性(CAS)功能:只有在您的服务实际依赖于PublisherMembershipCondition的情况下,禁用它才会导致问题.在所有其他情况下,它将使永久或间歇性启动失败消失,不再需要运行时进行昂贵的证书检查(包括撤销列表查找).


可靠方法是从服务中删除所有UI代码,并将其移动到在交互式用户会话内运行的单独可执行文件(例如,可以使用全局启动组启动可执行文件).
使用Authenticode签名程序集:通过在.exe.config文件中添加以下元素,

3> wbennett..:

我遇到了这个问题,因为运行我的服务的盒子上缺少框架.该框具有.NET 4.0,该服务是在.NET 4.5之上编写的.

我在盒子上安装了以下下载,重新启动,服务启动正常:http: //www.microsoft.com/en-us/download/details.aspx?id = 30653



4> Jacob..:

要调试服务的启动,请将以下内容添加到OnStart()服务方法的顶部:

 while(!System.Diagnostics.Debugger.IsAttached) Thread.Sleep(100);

这将停止服务,直到您使用调试 - >附加到进程手动附加Visual Studio调试程序...

注意:通常,如果您需要用户与您的服务进行交互,最好将GUI组件拆分为在用户登录时运行的单独Windows应用程序.然后使用命名管道或其他形式的IPC之类的东西建立GUI应用程序和您的服务之间的通信.事实上,这是Windows Vista中唯一可行的方法.



5> 小智..:

在OnStart方法中的服务类中不做大量操作,OS期望运行服务的时间短,使用线程启动运行你的方法:

protected override void OnStart(string[] args)
{
    Thread t = new Thead(new ThreadStart(MethodName)); // e.g.
    t.Start();
}



6> Mihai Limbăș..:

我在这里盲目拍摄,但我经常发现服务初创公司的长时间延迟是由网络功能超时直接或间接引起的,通常是在查找帐户SID时通常会联系域控制器 - 这通常是间接通过GetMachineAccountSid()是否意识到,因为RPC子系统调用该函数.

有关如何在这种情况下进行调试的示例,请参阅Mark Russinovich博客上的过程启动延迟案例.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有