.NET 6 连接到 Windows 会话切换

问题描述 投票:0回答:1

我正在将应用程序从 .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+?我错过了什么吗?也欢迎提出解决方法的建议。

c# .net .net-core dependency-injection asp.net-core-hosted-services
1个回答
0
投票

您是否找到了在.Net 6中处理Windows服务中的会话更改的解决方案。

我尝试了以下链接中提到的隐藏表单,但它不起作用 https://learn.microsoft.com/en-us/dotnet/api/microsoft.win32.systemevents?view=dotnet-plat-ext-3.1

© www.soinside.com 2019 - 2024. All rights reserved.