我正在将应用程序从 .NET Framework 迁移到 .NET 6。它在内部启动 Kestrel Web 服务器,并且旨在作为 Windows 服务运行 - 在使用 Topshelf 库实现的旧版本中,所以我继续使用它。需求之一是监听会话切换事件并向第三方应用程序发送消息。
在应用程序的旧版本中,在 Topshelf 的帮助下再次实现了这一目标。然而,在回调中使用了静态 DI 容器来访问服务:
return HostFactory.New((hostConfigurator) =>
{
// ...
hostConfigurator.EnableSessionChanged();
hostConfigurator.Service<WindowService>((serviceConfigurator) =>
{
serviceConfigurator.ConstructUsing(hostSettings => new WindowService());
// ...
serviceConfigurator
.WhenSessionChanged((serviceHelper, arguments) => serviceHelper.SessionChange(arguments));
// ...
});
// ...
});
这是回调:
private void SessionChange(SessionChangedArguments changeDescription)
{
var sessionService =
DependencyInjectionContainer.GetRequiredService<IUserSessionMonitoringService>();
if (sessionService == null)
{
LOG.Warning(...);
return;
}
sessionService.SessionChanged(...);
}
所以,问题来了:在回调中,使用静态
DependencyInjectionContainer
类来获取所需的服务。然而,在应用程序的新版本中,这种方法将不起作用,因为这个静态类已被放弃。另外,我什至无法访问内置的 .NET DI 容器,因为在配置 Topshelf 期间,容器并未构建。
作为进一步的步骤,我调查了 Topshelf 在该功能的底层使用了什么 - 即 SystemEvents.SessinSwitch 事件。我尝试从托管服务附加一个事件处理程序,其中注入了所需的服务。为了进行测试,我只想从事件处理程序将一些文本记录到文件中。但是,当注销/登录时,这些日志中的文件中没有任何内容。
public class SystemSessionMonitoringHostedService : IHostedService
{
private readonly IUserSessionMonitoringService userSessionMonitoring;
private readonly ILogger<SystemSessionMonitoringHostedService> logger;
public SystemSessionMonitoringHostedService(
IUserSessionMonitoringService userSessionMonitoring,
ILogger<SystemSessionMonitoringHostedService> logger)
{
this.userSessionMonitoring = userSessionMonitoring;
this.logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
SystemEvents.SessionSwitch += OnSessionChanged;
return Task.CompletedTask;
}
private void OnSessionChanged(object sender, SessionSwitchEventArgs eventArgs)
{
var json = JsonConvert.SerializeObject(eventArgs);
logger.LogCritical($"Object: {json}");
}
}
有谁知道这些
SystemEvents
是否适用于.NET Core/5+?我错过了什么吗?也欢迎提出解决方法的建议。
您是否找到了在.Net 6中处理Windows服务中的会话更改的解决方案。
我尝试了以下链接中提到的隐藏表单,但它不起作用 https://learn.microsoft.com/en-us/dotnet/api/microsoft.win32.systemevents?view=dotnet-plat-ext-3.1