zoukankan      html  css  js  c++  java
  • .NET Core中的Worker Service

    当你想到ASP.NET Core时,可能会想到Web应用程序后端代码,包括MVC和WebAPI。MVC视图和Razor页面还允许使用后端代码生成带有HTML元素的前端UI。全新的Blazor更进一步,允许使用WebAssembly在Web浏览器中运行客户端.NET代码。最后,我们现在有了一个Worker Service应用程序的模板。

    这是在ASP.NET Core早期预览中引入的。虽然项目模板最初列在Web模板下,但此后在向导中重新定位了一个级别。这是在.NET Core中创建长时间运行的跨平台服务的好方法。本文介绍Windows操作系统。

    Worker Service项目

    在VisualStudio 2019中创建新的Worker Service项目的最快方法是使用最新模板。还可以使用适当的DotNetCLI命令。

    启动VisualStudio并选择Worker Service模板,如下所示:

    要使用命令行,使用以下命令,-o是一个可选标志,用于为项目提供输出文件夹名:

    dotnet new worker -o myproject

    程序和后台服务

    Program.cs类包含Main()方法和CreateHostBuilder()方法。这可以在下面的片段中看到:

    public class Program
    {
       public static void Main(string[] args)
       {
          CreateHostBuilder(args).Build().Run();
       }
    
       public static IHostBuilder CreateHostBuilder(string[] args) =>
          Host.CreateDefaultBuilder(args)
          .UseWindowsService()
          .ConfigureServices(services =>
          {
             services.AddHostedService<Worker>();
          });
     }

    要注意的事情:

    1. Main方法调用CreateHostBuilder()方法,并运行它。

    2. 在ASP.NET Core中,WebHostBuilder将被Generic HostBuilder替代。

    3. CreateHostBuilder()创建主机并通过调用AddHostService<T>

    Worker.cs,定义如下:

    public class Worker : BackgroundService
    {
       // ...
     
       protected override async Task ExecuteAsync(CancellationToken stoppingToken)
       {
          // do stuff here
       }
    }

    要注意的事情:

    1. Worker类实现BackgroundService 类,它来自命名空间Microsoft.Extensions.Hoting

    2. 然后,Worker类可以重写ExecuteAsync()方法来执行任何长期运行的任务。

    Worker Service 中使用Logging

    若要在Worker Service项目中使用日志记录,可以在Program.cs:

    using Microsoft.Extensions.Logging;
    public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); });

    1.在使用扩展方法之前,将其NuGet包添加到项目中:

    Microsoft.Extensions.Logging.EventLog

    2.将适当的命名空间添加到代码中:

    using Microsoft.Extensions.Logging;

    3.调用方法ConfigreLogging()并调用适当的日志记录方法,例如:AddEventLog()。

    • AddConsole()
    • AddDebug()
    • AddEventLog()
    • AddEventSourceLogger()

    这个Worker类通过注入ILogger<Work>对象到构造函数中:

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

    运行Worker Service

    在继续之前,请将调用添加把UseWindowsService()添加到Program类或者确认它已经在那里了。官方文档中UseServiceBaseLifetime()在预览版中。在新的版本此方法已重命名为UseWindowsService()中。

     public static IHostBuilder CreateHostBuilder(string[] args) =>
          Host.CreateDefaultBuilder(args)
          .UseWindowsService()
          .ConfigureServices(services =>
          {
             services.AddHostedService<Worker>();
          });

    根据代码文档,UseWindowsService()进行下列工作:

    1. 将主机生存期设置为WindowsServiceLifetime

    2. 设置 ContentRoot

    3. 启用以应用程序名称作为默认名称的事件日志记录。

    你可以以各种方式运行Worker Service:

    1.在VisualStudio中生成和调试/运行。

    2.发布到exe文件并运行它

    3.运行sc(从WindowsSystem 32)创建新服务

    若要将Worker Service发布为具有依赖关系的exe文件,请运行以下命令:

    dotnet publish -o C:path	oprojectpubfolder

    -o参数可用于指定要生成已发布文件的文件夹的路径。它可以是指向项目文件夹的路径,然后是一个新的子文件夹名,以保存已发布的文件。

    若要创建新服务,请运行sc.exe从System 32文件夹中传入从发布命令生成的exe文件的名称。

    > C:WindowsSystem32sc create MyServiceName binPath=C:path	oprojectpubfolderMyProjectName.exe

    当手动运行服务时,你将看到以下的日志输出:

    info: WorkerServiceSample.Worker[0] Making doc 1 at: 06/09/2019 00:09:52 -04:00Making your document...
    info: WorkerServiceSample.Worker[0] Making doc 2 at: 06/09/2019 00:10:05 -04:00Making your document...
    info: Microsoft.Hosting.Lifetime[0]
     Application started. Press Ctrl+C to shut down.
    info: Microsoft.Hosting.Lifetime[0]
     Hosting environment: Development

    服务安装完成后,会出现在Windows的服务列表中:

     原文链接:https://wakeupandcode.com/worker-service-in-net-core-3-1/

  • 相关阅读:
    js正则
    【zookeeper】zookeeper 集群搭建
    【zookeeper】linux zookeeper的安装步骤
    【ActiveMQ】ActiveMQ之JDBC消息存储安装配置
    【数据库】Cannot create PoolableConnectionFactory (null, message from server: "Host 'xxxxx' isnot allow
    【ActiveMQ】Failed to bind to server socket: nio://0.0.0.0:61616 due to: java.net.BindException:
    【微服务】Springboot和ActiveMQ整合出现 Could not resolve placeholder 'xxx' in value "${xxx}"
    【ActiveMQ】记录一次activemq与jdk版本冲突问题
    【ActiveMq】linux ActiveMq安装
    【springcloud】Could not resolve type alias 'Dept'. Cause: java.lang.ClassNotFoundException
  • 原文地址:https://www.cnblogs.com/hhhnicvscs/p/14467765.html
Copyright © 2011-2022 走看看