• 在windows服务中托管asp.net.core


    参考:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-3.1&tabs=visual-studio

    背景:项目各个模块部署在不同位置,因此采用了微服务架构。由于安装部署环境的差异,部分模块只能部署在xp系统下,其他部署环境考虑使用net.core,在windows服务中托管webapi,或者在webapi中寄宿windows服务,总而言之就是在一个程序中将windows服务和webapi结合起来。

      项目中使用了两种将windows服务和webapi结合起来的方法、框架。一种是通过Topshelf,将控制台程序作为windows服务安装,同时将webapp启动的webapi寄宿到控制台程序中;第二种就是使用asp.net.core,托管到windows服务中。

      方法一:topshelf、控制台的方式。

      1.创建一个控制台应用程序,建议使用framework,据说某版本的topshelf不兼容netcore(未验证)。

      2.在main方法中使用以下代码。ServicesHost为自定义类,无其他父类。只需要实现其构造方法、服务开始方法、服务结束方法即可。如此即可将一个控制台程序作为windows服务来使用。关于服务的安装卸载,请自行查看topshelf,太简单不再赘述。

    HostFactory.Run(x =>
                {
                    x.Service<ServicesHost>(s =>
                    {
                        s.ConstructUsing(name => new ServicesHost());
                        s.WhenStarted(tc => tc.Start());
                        s.WhenStopped(tc => tc.Stop());
                    });
                    x.RunAsLocalSystem();
                    x.StartAutomaticallyDelayed();
                    x.SetDescription(“服务描述”);
                    x.SetDisplayName(“显示名称”);
                    x.SetServiceName(“服务名称”);//注意不要使用特殊字符
                });

      3.在ServicesHost的适当位置使用WebApp,为webapi指定端口。

     WebApp.Start(string.Format("http://*:{0}", ConfigHelper.Instance.WebPort));

      4.自定义控制器,继承ApiController。在控制器上添加RoutePrefix属性或者Route来进行路径控制。系统部署后即可实现将webapi托管到windows服务中。

      方法二:在windows服务中托管asp.net.core。

      1.创建一个asp.net.core webapplication 项目。
      2.在program配置service。 注意:2、4中的代码应在CreateHostBuilder链式实现。

    Host.ConfigureServices((host,services)=>{serices.AddHostedService<T where T:BackgroundService>()});

      3.自定义服务类T,继承BackgroundService,可以重写StartAsync、ExecuteAsync、StopAsync方法。在execute执行服务内容。

      4.配置host的默认配置,主要是指定端口号。

     Host.ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder
                        .UseUrls("http://*:5001", "http://*:5002")//配置监听端口
                        .UseStartup<Startup>()
                        .UseKestrel();//指定托管服务器,Kestrel 或者iis服务器都可以,推荐使用Kestrel,可以在无iis的环境使用。
                    });

      5.路由的使用。微软的推荐方式是使用了Route属性,在属性内添加控制器的路由模板。如果想用rest风格,不妨在Route属性自定义模板,通俗点说就是每个控制器都自己有个模板,看起来比较麻烦点但也保证了控制器的灵活性。 eg:

    [Route("[controller]")] // 访问路径: http://127.0.0.1:5002/WeatherForecast
    public class WeatherForecastController : ControllerBase{}
    [Route("api/[controller]")] 访问路径: http://127.0.0.1:5002/api/WeatherForecast
    public class WeatherForecastController : ControllerBase{}

      总结:根据实际情况使用如果是考虑跨平台,就用第二种。如果系统环境限制可以考虑使用第一种,都各有优劣。

      

  • 相关阅读:
    shell脚本,通过传入的参数来计算最大值和最小值以及平均值。
    mac date命令
    jstorm系列-2:入门
    jstorm系列-1:入门
    git 如何恢复只是提交到本地的文件(或者commit)
    shell 参数
    shell 运算符
    shell 中的<,<<,>,>>
    shell 学习笔记
    java 多线程剖析
  • 原文地址:https://www.cnblogs.com/cnDqf/p/12162850.html
Copyright © 2020-2023  润新知