天天看點

DotNetCore 3.x 程式部署成windows服務,并指定端口

1.Startup.cs代碼

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Qhbx.Information.DataSync.Core;
using Qhbx.Information.DataSync.Entities;
using Qhbx.Information.DataSync.Web.Middleware;
using Qhbx.Information.DataSync.Web.Models;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace Qhbx.Information.DataSync.Web
{
    public class Startup
    {
        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="configuration"></param>
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        /// <summary>
        /// 配置實體
        /// </summary>
        public IConfiguration Configuration { get; }


        /// <summary>
        /// 配置服務
        /// </summary>
        /// <param name="services"></param>
        public void ConfigureServices(IServiceCollection services)
        {

            //注冊Jwt配置資訊到容器
            services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));


            var _connectionString = Configuration.GetConnectionString("Default");
            services.AddDbContext<DbContext, DefaultDbContext>(options =>
            {
                options.UseMySQL(_connectionString, b => b.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name));
            });

            //加載Jwt配置資訊
            var jwtSettings = new JwtSettings();
            Configuration.Bind("JwtSettings", jwtSettings);
            services.AddAuthentication(options =>
            {
                //認證配置
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(options =>
            {
                //jwt配置
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,//是否驗證Issuer
                    ValidateAudience = true,//是否驗證Audience
                    ValidateLifetime = true,//是否驗證失效時間
                    ValidateIssuerSigningKey = true,//是否驗證SecurityKey
                    ValidAudience = jwtSettings.Audience,//Audience
                    ValidIssuer = jwtSettings.Issuer,//Issuer,這兩項和前面簽發jwt的設定一緻
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey))//拿到SecurityKey
                };
            });

            services.AddCustomService("Qhbx.Information.DataSync.Services");

            services.AddControllers();
            //配置Swagger
            services.AddSwaggerGen(options =>
            {
                options.SwaggerDoc("v1", new OpenApiInfo()
                {
                    Title = $"農産品設施基地追溯系統",
                    Version = "V1.0",
                    Description = "農産品設施基地追溯接口文檔"
                });

                //添加Bearer驗證
                options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    Description = "請輸入Token,格式:Bearer {token}",
                    Name = "Authorization",
                    In = Microsoft.OpenApi.Models.ParameterLocation.Header,
                    Type = Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey
                });

                options.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement()
                {
                    {
                        new Microsoft.OpenApi.Models.OpenApiSecurityScheme()
                        {
                            Reference = new Microsoft.OpenApi.Models.OpenApiReference(){Type=Microsoft.OpenApi.Models.ReferenceType.SecurityScheme, Id="Bearer"}
                        },
                        new List<string>()
                    }
                });
                options.ResolveConflictingActions(des => des.First());
                options.IncludeXmlComments(@"Qhbx.Information.DataSync.Web.xml", true);
                options.IncludeXmlComments(@"Qhbx.Information.DataSync.Entities.xml", true);
                options.IncludeXmlComments(@"Qhbx.Information.DataSync.Models.xml", true);
            });




            services.AddHttpClient();
        }


        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.Use(next => new RequestDelegate(
                async context =>
                {
                    context.Request.EnableBuffering();
                    await next.Invoke(context);
                }
                ));
            app.UseCustomException();

            app.UseAuthentication();

            app.UseCors(configure =>
            {
                configure.AllowAnyHeader();
                configure.AllowAnyOrigin();
                configure.AllowAnyMethod();
            });

            app.UseRouting();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });

            //配置Swagger
            app.UseSwagger();
            app.UseSwaggerUI(options =>
            {
                options.DocumentTitle = "綜合資訊服務接口文檔";
                options.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.None); //控制顯示折疊
                options.EnableFilter("");  //顯示清單過濾
                options.DisplayRequestDuration();  //顯示請求時間
                options.ShowExtensions();
                options.SwaggerEndpoint($"/swagger/v1/swagger.json", "V1.0");
            });
        }
    }
}
           

2.Program.cs代碼

using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
using NLog.Web;
using Microsoft.Extensions.Configuration;

namespace Qhbx.Information.DataSync.Web
{
    public class Program
    {
        //public static void Main(string[] args)
        //{
        //    CreateWebHostBuilder(args).Build().Run();
        //}

        //public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        //    WebHost.CreateDefaultBuilder(args)
        //        .UseStartup<Startup>();
        /// <summary>
        /// 程式入口
        /// </summary>
        /// <param name="args"></param>
        public static async Task Main(string[] args)
        {
            await CreateHostBuilder(args).Build().RunAsync();
        }

        private static IHostBuilder CreateHostBuilder(string[] args)
        {
            //var configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
            //.AddJsonFile("host.json")
            //.Build();
            //var url = configuration["url"];

            var host = Host.CreateDefaultBuilder(args);

            var isService = args.Contains("--service") || args.Contains("-s");
            if (isService)
            {
                args = args.Where(d => d != "--service" && d != "-s").ToArray();
                var rootPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
                Directory.SetCurrentDirectory(rootPath);
                host.UseWindowsService().UseSystemd();
            }


            host.ConfigureWebHostDefaults(webBuilder =>
            {
                //webBuilder.UseUrls(configuration["url"]);
                webBuilder.UseStartup<Startup>();
                webBuilder.UseNLog();
            });
            return host;
        }
    }
}

           

3.windows服務 指令行執行

DotNetCore 3.x 程式部署成windows服務,并指定端口

4.常用windows指令

正式環境記得xml複制到根目錄下

a.建立windows服務:sc create InformationAPI binPath=“C:\inetpub\wwwroot\InformationAPI\Core31-API\Qhbx.Information.DataSync.Web.exe -s --urls=http://0.0.0.0:9199” displayName=“InformationAPI” start=auto

sc create InformationAPI binPath=“D:\www\InformationApi\Core31-API\Qhbx.Information.DataSync.Web.exe -s --urls=http://0.0.0.0:9104” displayName=“InformationAPI” start=auto

(-s:以服務方式啟動。 -urls: 指定端口号 。 )

b.啟動Windows服務:sc start InformationAPI

c.停止Windows服務:sc stop InformationAPI

d.删除Windows服務:sc delete InfoemationAPI

繼續閱讀