topshelf+asp.net core webapi(mvc)+swagger部署windows服务

前奏 ,asp.net core mvc+api已经能正常部署IIS使用,由于设置quartz.net job运行,IIS因为存在回收问题(虽然可以部署时设置IIS不回收,但总想找找部署windows服务);所以使用了topshelf 部署调整;

由于程序已经能在IIS上运行,所有autofac都已经完成;参考了网上很多的方案,及topshelf官网,但都不是很明确。处理了很多;验证出可行的方案,记录一下;

换成windows 服务部署 :只需调整 Program.cs的部分即可

原来的program.cs部分

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

        public static IHostBuilder CreateHostBuilder(string[] args) =>
                      Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>()
                     .ConfigureLogging((hostingContext, builder) =>
                     {
                         //过滤掉系统默认的一些日志
                         builder.AddFilter("System", LogLevel.Error);
                         builder.AddFilter("Microsoft", LogLevel.Error);
                         builder.AddFilter("MediCore.AuthHelper.ApiResponseHandler", LogLevel.Error);

                         //可配置文件
                         var path = Path.Combine(Directory.GetCurrentDirectory(), "Log4net.config");
                         builder.AddLog4Net(path);
                     })
                     .UseUrls("http://localhost:8888");
                });
    }

  调整为: 

  public static void Main(string[] args)
        {
            var rc = HostFactory.Run(x =>                                 
            {
                x.Service<MainService>(s =>                                
                {
                    s.ConstructUsing(name => new MainService(args));              
                    s.WhenStarted(tc => tc.Start());                     
                    s.WhenStopped(tc => tc.Stop());                       
                });
                x.RunAsLocalSystem();                                    

                x.SetDescription("JwtAPIService");                
                x.SetDisplayName("JwtAPIService");                               
                x.SetServiceName("JwtAPIService");                                
            });                                                          

            var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode()); 
            Environment.ExitCode = exitCode;
           // CreateHostBuilder(args).Build().Run();
        }

  将 hostbuider部分写入调用的MainService中

    public class MainService
    {
        private string[] args;
        public MainService(string[] vs)
        {
            args = vs;
        }
        public void Start()
        {
            
            var isService = !(Debugger.IsAttached || args.Contains("--console"));
            //官网实列  public static IWebHostBuilder CreateWebHostBuilder(string[] args) 调整成 CreateHostBuilder
            var builder = CreateHostBuilder(args.Where(arg => arg != "--console").ToArray());
            //这部分先不考究
            if (isService)
            {
                var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
                var pathToContentRoot = Path.GetDirectoryName(pathToExe);
                builder.UseContentRoot(pathToContentRoot);
            }

            var host = builder.Build();
            host.Run();
        }

        public void Stop()
        {

        }

   
        public static IHostBuilder CreateHostBuilder(string[] args) =>
                  Host.CreateDefaultBuilder(args)
        .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>()
                 .ConfigureLogging((hostingContext, builder) =>
                 {
                         //过滤掉系统默认的一些日志
                         builder.AddFilter("System", LogLevel.Error);
                     builder.AddFilter("Microsoft", LogLevel.Error);
                     builder.AddFilter("MediCore.AuthHelper.ApiResponseHandler", LogLevel.Error);

                         //可配置文件
                         var path = Path.Combine(Directory.GetCurrentDirectory(), "Log4net.config");
                     builder.AddLog4Net(path);
                 })
                 .UseUrls("http://localhost:8888");
            });
    }

  部署:

cmd 带上发布的路径执行exe

安装:MediDemo.exe install
启动:MediDemo.exe start
卸载:MediDemo.exe uninstall
 
 本身集成了swagger
http:localhost:8888/swagger/index.html 可以正常查看,接口也能正常调试
到这里还有一个问题就是,本身程序还是包括mvc后台管理程序,这时候访问mvc部分,样式都没有了,留给后面查证时什么问题,应该时静态类文件加载不上
 
正常IIS登录时这样的

 

 

 

 

posted on 2020-09-29 11:28  最聪明的猪  阅读(979)  评论(0)    收藏  举报