首页 > 解决方案 > 如何在 Web 应用程序中使用已经运行的 .Net Core WorkerService?

问题描述

我正在尝试访问由我的网络应用程序中的工作服务生成的日志。我做了一个测试解决方案: 在此处输入图像描述

我有一个 ILogGenerator 接口来生成日志和一个实现它的工作人员:

public interface ILogGenerator
{
    event EventHandler<string> LogGenerated;
}

public class Worker : BackgroundService, ILogGenerator
{
    private readonly ILogger<Worker> _logger;

    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
    }

    public event EventHandler<string> LogGenerated;

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            var log = $"Worker running at: {DateTimeOffset.Now} {new Guid()}";

            LogGenerated?.Invoke(this, log);

            _logger.LogInformation(log);
            await Task.Delay(10000, stoppingToken);
        }
    }
}

从我的网络应用程序的启动中,我将其添加为托管服务:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        services.AddServerSideBlazor();
        services.AddSingleton<WeatherForecastService>();

        services.AddHostedService<Worker>();

        services.AddTransient<WorkerConsumer>();
    }

我有一个工人消费者,我想将日志打印到控制台:

public class WorkerConsumer
{
    public WorkerConsumer(ILogGenerator worker)
    {
        worker.LogGenerated += Worker_LogGenerated;
    }

    private void Worker_LogGenerated(object sender, string e)
    {
        Debug.WriteLine(e);
    }
}

我将两个项目都添加到启动中: 在此处输入图像描述

当我启动应用程序时,我收到此错误。 在此处输入图像描述

如果我不调用工人消费者,它可以工作,但我会创建两个 WorkerService1。

public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        services.AddServerSideBlazor();
        services.AddSingleton<WeatherForecastService>();

        services.AddHostedService<Worker>();

        //services.AddSingleton<WorkerConsumer>();
    }

如果我不添加工作服务来启动,并且我在索引页面中注入工作消费者,它可以工作,但是工作服务不再作为单独的控制台应用程序运行。

更新 1:我的 WorkerService 的 Program.cs 看起来像:

namespace WorkerService1
{
    public class Program
    {
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                    // services.AddTransient<ILogGenerator>(l => l.GetRequiredService<Worker>());
                });

        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
    }
}

我的 Web 应用程序的 Startup.cs ConfigureServices 如下所示:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddServerSideBlazor();

            // services.AddHostedService<Worker>();
            services.AddTransient<ILogGenerator>(l => l.GetRequiredService<Worker>());

            services.AddTransient<WorkerConsumer>();
        }

我首先启动工作服务,然后是网络应用程序,我得到: 在此处输入图像描述

我的理解是工作服务已注册到主机,并且网络应用程序应该能够从主机中提取该工作服务,对吗?

标签: asp.net-core.net-coremicroservicesblazor

解决方案


根据您的错误消息,您遇到了依赖注入问题。

这可能是因为您忘记在 IServiceCollection 中注册 ILogGenerator 接口及其各自的实现。

问候,


推荐阅读