事件发生错误时重启服务 C#

Restart Service C# when error occurs in event

我有一个监视文件夹并执行操作的服务。

一切正常。

但是,如果我故意在创建文件时调用的事件方法中抛出异常,我的服务就会停止。我以为 windows 如果服务停止会自动尝试再次启动服务,但看起来情况并非如此。

有几个我可以使用的重启服务的例子,但我只是想知道我是否遗漏了一些明显的东西?

看来我需要在整个 try/catch 块中添加一些内容才能重新启动服务?

这是设置文件夹监视程序的方法:

    public void Start()
    {
        var setting = ConfigurationManager.AppSettings["FolderToMonitor"];
        var path = string.IsNullOrEmpty(setting) ? "c:\temp\spreadsheets": setting;

        var processedPath = path + "\Processed";
        Directory.CreateDirectory(processedPath);

        var errorsPath = path + "\Errors";
        Directory.CreateDirectory(errorsPath);

        _watcher = new FileSystemWatcher
        {
            Path = path,
            NotifyFilter = NotifyFilters.Attributes |
                           NotifyFilters.CreationTime |
                           NotifyFilters.DirectoryName |
                           NotifyFilters.FileName |
                           NotifyFilters.LastAccess |
                           NotifyFilters.LastWrite |
                           NotifyFilters.Security |
                           NotifyFilters.Size,
            Filter = "*.*",
            EnableRaisingEvents = true
        };

        _watcher.Created += OnFileCreated;
    }

创建文件时调用此事件

   private void OnFileCreated(object sender, FileSystemEventArgs e)
   {
     while (!IsFileReady(e.FullPath))
     {
     }

     Process(e.FullPath);
  }

这里我现在故意抛出一个异常:

    public virtual void Process(string filename)
    {
        var path = Path.GetDirectoryName(filename);
        var processedPath = path + "\Processed";            
        var errorsPath = path + "\Errors";

        var filenameOnly = Path.GetFileName(filename);

        try
        {
            ReadFile(filename);

            if (filename.Contains("hello"))
            {
                throw new Exception("TEST ERRROR");
            }
        }
        catch (Exception e)
        {
            Log.Error(e, "Error processing file");
            File.Move(filename ?? throw new InvalidOperationException(), $"{errorsPath}\{filenameOnly}");

            throw;
        }

        Log.Information($"File processed {filename}.  Moved to processed folder");
        File.Move(filename ?? throw new InvalidOperationException(), $"{processedPath}\{filenameOnly}");
    }

如果我尝试使用下面的代码自行重启服务

var service = ServiceController.GetServices("My Service Name").FirstOrDefault();
            if (service?.Status == ServiceControllerStatus.Stopped)
            {
                service.Start();
            }

我收到错误

'Cannot open Service Control Manager on computer 'My Service Name'. This operation might require other privileges.'

我已经双重和三次检查 - 我的服务名称是正确的。我也在管理员模式下 运行ning Visual Studio。

服务正在运行作为本地系统用户。

它说 "this operation might require other privileges" ,但它不应该,因为你说它是 运行 管理员权限,但仍然让我们试一试。

转到添加新项目并将应用程序清单文件添加到您的项目

改变

 <requestedExecutionLevel level="isInvoker" uiAccess="false" />

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

这可能会解决您的问题,请确保您 运行 您的应用程序的发布版本而不是调试。

Local System account has does not have the privileges 与您尝试执行的服务控制管理器 (SCM) 交互。

您需要 运行 具有这些权限的不同帐户的服务。

如果你必须运行作为Local System,那我建议你自己配置SCM来重启服务。大多数系统管理员无论如何都会喜欢这个,因为他们可以控制发生的事情。这是一个非程序化的解决方案。