我正在Windows平台上使用.NET开发服务。
它一直工作到昨天......但今天它不想开始!这看起来很奇怪,我觉得我错过了什么......
我还尝试将源恢复到最后一个工作版本,但没有其他任何事情发生: net start 输出:
服务未响应控制功能。
什么可能导致这种故障?
大概你们大多数人都想了解更多。所以,让我给你看一些代码:
服务代码:
#if DEBUG
class iGeckoService : DebuggableService
#else
class iGeckoService : ServiceBase
#endif
{
static void Main()
{
#if DEBUG
if (Debugger.IsAttached == true) {
DebuggableService[] services = Services;
// Create console
AllocConsole();
// Emulate ServiceBase.Run
foreach (DebuggableService service in services)
service.Start(null);
// Wait for new line
Console.WriteLine("Press ENTER to exit..."); Console.ReadLine();
// Emulate ServiceBase.Run
foreach (DebuggableService service in services)
service.Stop();
} else
ServiceBase.Run(Services);
#else
ServiceBase.Run(Services);
#endif
}
#if DEBUG
static DebuggableService[] Services
{
get {
return (new DebuggableService[] { new iGeckoService() });
}
}
[DllImport("kernel32")]
static extern bool AllocConsole();
#else
static DebuggableService[] Services
{
get {
return (new ServiceBase[] { new iGeckoService() });
}
}
#endif
#endregion
#region Constructors
/// <summary>
/// Default constructor.
/// </summary>
public iGeckoService()
{
// Base properties
ServiceName = DefaultServiceName;
// Service feature - Power events
}
#endregion
protected override void OnStart(string[] args)
{
try {
...
} catch (Exception e) {
sLog.Error("Unable to initialize the service. Request to stop.", e);
}
}
/// <summary>
/// Stop this service.
/// </summary>
protected override void OnStop()
{
...
}
}
[RunInstaller(true)]
public class iGeckoDaemonInstaller : Installer
{
/// <summary>
/// Default constructor.
/// </summary>
public iGeckoDaemonInstaller()
{
ServiceProcessInstaller spi = new ServiceProcessInstaller();
spi.Account = ServiceAccount.LocalSystem;
ServiceInstaller si = new ServiceInstaller();
si.ServiceName = iGeckoService.DefaultServiceName;
si.StartType = ServiceStartMode.Automatic;
Installers.AddRange(new Installer[] {spi, si});
}
}
class DebuggableService : ServiceBase
{
public void Start(string[] args) { OnStart(args); }
}
启动脚本是:
installutil ..\bin\Debug\iGeckoService.exe
net start "Gecko Videowall"
停止脚本是:
net stop "Gecko Videowall"
installutil /u ..\bin\Debug\iGeckoService.exe
但是,我认为这是一个系统设置,因为应用程序一直运行到最后一天。 (叹气)。
更新
当服务工作时,我使用log4net记录服务活动(我无法将调试器附加到正在运行的服务......),并且它始终记录。
从现在开始,log4net日志永远不会被创建(即使我启用了内部调试选项),即使我登录Main例程!
另一次更新
似乎应用程序永远不会执行。我减少了每个例程(Main,OnStart,OnStop),并且我运行了一个空服务。 OnStart例程在目录上创建一个文件(每个人都可以完全写入),但是当服务启动时,不会创建任何文件。
又一次更新
在Rob的评论的刺激下,我在事件查看器上看到了这条消息:
> Faulting application name: iGeckoService.exe, version: 1.0.0.0, time stamp: 0x4c60de6a
> Faulting module name: ntdll.dll, version: 6.1.7600.16385, time stamp: 0x4a5be02b
> Exception code: 0x80000003
> Fault offset: 0x000000000004f190
> Faulting process id: 0x1258
> Faulting application start time: 0x01cb384a726c7167
> Faulting application path: C:\Users\Luca\Documents\Projects\iGeckoSvn\iGeckoService\bin\Debug\iGeckoService.exe
> Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
> Report Id: b096a237-a43d-11df-afc4-001e8c414537
这肯定是服务关闭的原因......没有问题变成:“如何调试?”(谢谢Rob,我从未想过事件查看器,直到现在!) 调试它作为控制台应用程序运行它没有显示任何错误,实际上它似乎与服务环境有关。我唯一想到的可能是一些DLL加载失败,因为现在服务是空的......任何想法?
(谢谢大家关注我......我想为你提供比萨饼和啤酒)
解决!
由于安装和设置MS Application Verifier(x64)导致Main例程崩溃,服务无法启动。卸载该应用程序后,一切正常![/ p>
谢谢大家!
答案 0 :(得分:5)
一般来说,每项服务都必须遵循两件简单的事情
SERVICE_CONTROL_START
,SERVICE_CONTROL_STOP
等,则应该在短时间内返回。使用SetServiceStatus
函数服务可以延长此间隔,例如调用SetServiceStatus
并增加dwCheckPoint
值。 (在.NET中,可以使用ServiceBase.RequestAdditionalTime代替)SERVICE_CONTROL_INTERROGATE
控制代码。服务管理器使用此控制代码来检测服务是否仍然存在。如果您的程序没有遵循其中一条规则,则会收到错误“服务未响应控制功能。”
如果你用.NET编写一个程序,你不需要直接做我之前描述的两件事。 ServiceBase
课程为您服务。不过,如果创建一个优先级高于正常运行的线程,或者在OnXXX句柄(OnStop
,OnStart
,{OnPowerEvent
内进行了太长时间的工作,则可以轻松破坏此规则。 {1}}等)没有调用ServiceBase.RequestAdditionalTime。其他一些带有额外线程的技巧也会产生问题。
答案 1 :(得分:3)
如果您在OnStart
电话中尝试做太多工作,通常会发生这种情况。例如,如果在同一个线程中启动无限循环,则会收到此错误消息。
通常,服务应在OnStart
调用中创建一个新线程,然后在OnStop
调用中彻底终止它。
当然,如果您使用以前正在运行的代码,那将无济于事。自从失败以来你试过重启吗?我似乎记得,如果你已经获得了一项服务,那么在不重新启动它的情况下回到工作状态有时会很棘手。您可能需要查看进程列表,看看是否还有一个副本仍在运行,如果是这样的话就将其杀死。
答案 2 :(得分:0)
我看到有一个代码块
// Wait for new line
Console.WriteLine("Press ENTER to exit..."); Console.ReadLine();
<@>如@Jon所述,因为这是一项服务。当服务开始时,它等待规定的时间,它应该响应。
有一条声明“Console.ReadLine()
”您服务将等到按下该键。因为这是一个服务将在这一点等待
答案 3 :(得分:0)
对我来说,这仅意味着正在抛出异常。 (配置管理器中的平台冲突,导致“错误的图像格式”。)尝试从命令行运行.exe,看看是否出现错误。