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服務 指令行執行
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