NetCore 开发服务 (Windows Linux)

2020-12-17  乐帮网

service centos

.net framwork时代使用C#可以很轻松的在Windows 下建立一个服务,那么到了NetCore时代是否仍然可以做到呢?答案是肯定的,而且同一套代码可以同时发布到Windows和Linux下。不需要做任何改动,只是部署方式上稍有不同。下面跟我一起做吧。

目标:新建一个日志打印类持续打印输出日志。

一、新建一个项目,我使用的是VS2019,选择项目类型如下图,到后面还需要选一个辅助角色服务,直接下一步使用默认选项点击创建即可。

二、添加配置文件 appsettings.json ,默认生成的项目里只有appsettings.Development.json,这个是咱们的开发环境加载的配置,还需要手动复制一下appsettings.Development.json中的内容到新建文件 appsettings.Production.json中。这样开发配置和生产环境的配置文件就都有了。

三、Nuget添加依赖包,Microsoft.Extensions.Hosting.Systemd (linux使用)Microsoft.Extensions.Hosting.WindowsServices(Windows)和日志包,Nlog,NLog.Web.AspNetCore,这里我选择NLog,方便打印日志,以验证我们的服务在正常执行。

四、在根目录添加NLog.config文件,(记得把NLog.config文件属性改为复制内容)具体内容可参考这里:https://lebang2020.cn/details/20121721es02k3.html

五、新建一个业务实现类,我们实现的功能是打印日志 BeanProvider还有接口IBeanProvider,代码如下 :

 public interface IBeanProvider
    {
        void Main();
    }
/// <summary>
    /// xinsiyu2008@gmail.com
    /// </summary>
    public class BeanProvider
    {
        private readonly ILogger<Worker> _logger;

        private readonly IConfiguration _configuration;

        public BeanProvider(ILogger<Worker> logger, IConfiguration configuration)
        {
            _logger = logger;
            _configuration = configuration;
        }
        public void Main()
        {
            _logger.LogInformation("BeanProvider Running...");
        }
    }

六、改写Worker类,把我们写的实现类添加到执行当中。

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

        private readonly IConfiguration _configuration;

        private readonly IBeanProvider _beanProvider;

        public Worker(ILogger<Worker> logger, IConfiguration configuration, IBeanProvider beanProvider)
        {
            _logger = logger;
            _configuration = configuration;
            _beanProvider = beanProvider;
        }
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                try
                {
                    _beanProvider.Main();
                }
                catch(Exception ex)
                {
                    _logger.LogError(ex.Message,ex);
                }
                await Task.Delay(1000, stoppingToken);
            }
        }
        public override Task StartAsync(CancellationToken cancellationToken)
        {
            _logger.LogInformation($"Worker started at: {DateTime.Now}");
            return base.StartAsync(cancellationToken);
        }
        public override Task StopAsync(CancellationToken cancellationToken)
        {
            _logger.LogInformation($"Worker stopped at: {DateTime.Now}");
            return base.StopAsync(cancellationToken);
        }
        public override void Dispose()
        {
            _logger.LogInformation($"Worker disposed at: {DateTime.Now}");
            base.Dispose();
        }
    }

七、关键步骤,修改程序启动类Program,如下:

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

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .UseSystemd()  //使用systemd方式,部署linux服务
            .UseWindowsService()//使用windows模式
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddSingleton<IBeanProvider, BeanProvider>();
                    services.AddHostedService<Worker>();
                }).ConfigureLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.AddNLog("NLog.config");
                }).UseNLog();
    }

八、部署发布

在程序的目录下:bin\Debug\netcoreapp3.1 便是我们需要部署的程序(我是debug模式下生成的)。
Windows下部署参见:https://lebang2020.cn/details/201217zj3hm3vw.html
Linux下部署参见:https://lebang2020.cn/details/201217nfitaj1o.html

源码下载:https://lebang2020.cn/details/201217mdndy3lk.html

NetCore 中使用Nlog 简单几步搞定

原创作品,禁止转载!

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力