2

我有一个自托管的 wcf 服务,它通过 dll 导入和 pinvoke 使用旧版 c++ 代码。在旧代码中有一些实例,异常是由函数(在旧应用程序中处理,但不在服务中处理)引起的,当它们发生时,我的服务正在停止。例外情况很少见;但是,我不希望我的服务由于另一个程序集的崩溃而随机停止。异常不会冒泡到服务中,因此我无法在服务中尝试/捕获它们。有没有办法在崩溃时自动重启服务?

它是自托管的,而不是通过 IIS。

提前致谢!!

4

2 回答 2

4

在运行服务的机器上,您可以打开服务管理控制台(开始 > 运行 > services.msc)。找到您的服务,右键单击它并选择属性。在弹出窗口中,单击“恢复”选项卡。将 First、Second 和 Subsequent failures 全部设置为 Restart Service。

如果您使用 WIX 安装项目,您还可以使用util:ServiceConfig元素设置这些属性。

如果您使用的是标准 ServiceInstaller,则这些选项不是内置的。我建议您查看通过标准服务安装程序接口公开属性的ServiceInstaller Extension类。

于 2012-11-06T15:11:16.060 回答
1

好吧,我假设您正在为您正在做的事情创建一个 Windows 服务项目。进入您的 ProjectInstaller 并找到“AfterInstall”方法。在这里,您需要添加代码以在服务控制器上执行命令以设置恢复选项。不幸的是,即使 .NET 有一个 ServiceController,您也需要通过进程启动来执行命令。

using (var process = new Process())
{
    var startInfo = process.StartInfo;
    startInfo.FileName = "sc";
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;

    // tell Windows that the service should restart if it fails
    startInfo.Arguments = string.Format("failure \"{0}\" reset= 0 actions= restart/60000", serviceName);

    process.Start();
    process.WaitForExit();

    exitCode = process.ExitCode;

    process.Close();
}

注意:我从另一个问题中窃取了此代码

于 2012-11-06T15:08:10.467 回答