事件发生错误时重启服务 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来重启服务。大多数系统管理员无论如何都会喜欢这个,因为他们可以控制发生的事情。这是一个非程序化的解决方案。
我有一个监视文件夹并执行操作的服务。
一切正常。
但是,如果我故意在创建文件时调用的事件方法中抛出异常,我的服务就会停止。我以为 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来重启服务。大多数系统管理员无论如何都会喜欢这个,因为他们可以控制发生的事情。这是一个非程序化的解决方案。