【问题标题】:Automatically restart a self hosted wcf service on crash崩溃时自动重启自托管 wcf 服务
【发布时间】:2012-11-06 14:49:34
【问题描述】:

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

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

提前致谢!!

【问题讨论】:

    标签: c# c++ wcf service


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我假设您正在为您正在做的事情创建一个 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();
      }
      

      注意:我从another question此代码

      【讨论】:

        猜你喜欢
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多