asp.net 集成必要的组件和注入
工程源码下载:GPS定位系统VUE版本源码下载
在上一节中,我们已经新建了工程,这一节中,我们需要在工程中添加自己的控制器模块,以及jwt,来实现api的权限控制。
新增控制器
首先在Controllers目录下新增“HomeController.cs”和“LoginController.cs”两个文件; LoginController.cs用于编写用户登录所需要的所有api,不做jwt权限控制;HomeController.cs用于编写地图数据和报表数据的api,需要支持jwt权限控制。
然后删除项目中的“WeatherForecastController.cs”和“WeatherForecast.cs”两个文件,这是项目自带的,没啥用。
HomeController.cs 内容如下:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace WebApplicationApi.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize]
public class HomeController : Controller
{
private readonly IConfiguration configuration;
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger, IConfiguration configuration)
{
this.configuration = configuration;
this._logger = logger;
}
}
}
LoginController.cs 内容如下:
using Microsoft.AspNetCore.Mvc;
namespace WebApplicationApi.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class LoginController : Controller
{
private readonly IConfiguration configuration;
private readonly ILogger<LoginController> _logger;
public LoginController(ILogger<LoginController> logger, IConfiguration configuration)
{
this.configuration = configuration;
this._logger = logger;
}
}
}
修改appsettings.json配置
修改appsettings.json配置文件,新增的配置项一共有三个。
1、jwt配置,用于设置jwt生成密钥以及有效期,我们这里设置有效期为24个小时。
2、数据库和tcp通讯配置,数据库连接我们这边配置的是mysql的地址信息,我这里配置的是本地地址localhost。另一个tcp配置是用于gps通讯用的连接地址信息。
3、日志输出的路径信息,用于输出系统日志,输出地址是“wwwroot/applogs/”目录,这个目录我们需要手动新建一下,日志按每日一个文件的形式进行保存。
{
// 1、系统默认配置,不要动
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
// 2、JWT配置信息
"JWT": {
"SecretKey": "AAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCC", // 私钥
"Issuer": "http://localhost:5059", //发布者
"Expires": "24", // 有效期设置
"Audience": "http://localhost:5059" //接收者
},
// 3、数据库和tcp通讯配置
"ConnectionStrings": {
"mysql": "Server=localhost;port=3306;Database=GpsDemo;Uid=root;Pwd=123456;persistsecurityinfo=True;Character Set=utf8",
"tcp": "127.0.0.1:2234"
},
// 4、日志输出路径信息
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Information",
"Microsoft.EntityFrameworkCore": "Warning"
}
},
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"shared": true,
"rollingInterval": "Day",
"restrictedToMinimumLevel": "Information",
"path": "wwwroot/applogs/logs.txt",
"outputTemplate": "{Timestamp:yyyy/MM/dd HH:mm:ss.fff zzz} {Application} [{Level}] {Message}{NewLine}{Exception}"
}
}
]
}
}
添加完之后,就是下面这个样子了。

修改Program.cs配置
为了方便大伙理解,我这边直接提供完整的Program.cs配置信息,我在代码中做注释讲解。
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Quartz;
using Serilog;
using Serilog.Events;
using System.Text;
namespace WebApplicationApi
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
#region JWT功能配置
// 需要安装 Microsoft.AspNetCore.Authentication.JwtBearer 6.0.29版本的组件
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters()
{
//验证发布者
ValidateIssuer = true,
ValidIssuer = builder.Configuration["JWT:Issuer"],
//验证接收者
ValidateAudience = true,
ValidAudience = builder.Configuration["JWT:Audience"],
//验证是否过期
ValidateLifetime = true,
//验证私钥
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:SecretKey"]))
};
});
// 配置Swagger身份验证输入
builder.Services.AddSwaggerGen(options =>
{
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "Value: Bearer {token}",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
BearerFormat = "JWT",
Scheme = "Bearer",
});
//添加安全要求
options.AddSecurityRequirement(new OpenApiSecurityRequirement {
{
new OpenApiSecurityScheme{
Reference =new OpenApiReference{
Type = ReferenceType.SecurityScheme,
Id ="Bearer"
}
},new string[]{ }
}
});
//SwaggerUI 添加中文注释提示
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
string xmlPath = "WebApplicationApi.xml"; // WebApplicationApi.xml文件就是在项目属性里面配置的文件名
string commentsFile = Path.Combine(baseDirectory, xmlPath);
//将注释的XML文档添加到SwaggerUI中
options.IncludeXmlComments(commentsFile);
});
#endregion
# region 配置跨域服务
builder.Services.AddCors(options =>
{
options.AddPolicy("cors", p =>
{
p.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
#endregion
#region job服务
// 需要安装 Quartz.Extensions.Hosting 最新版 3.11.0 的组件
// 博主这里没用到这个功能,只是保留,给大伙做个演示
// 定时设置方法:https://blog.51cto.com/u_11990719/3241430
builder.Services.AddQuartz(q =>
{
q.SchedulerId = "Scheduler-Core";
q.UseDefaultThreadPool(tp => { tp.MaxConcurrency = 10; });
//q.ScheduleJob<JobDemo1>(trigger => trigger.WithCronSchedule("*/1 * * * * ?"));
//q.ScheduleJob<JobDemo2>(trigger => trigger.WithCronSchedule("*/1 * * * * ?"));
});
builder.Services.AddQuartzHostedService(options =>
{
options.WaitForJobsToComplete = true;
});
#endregion
#region 配置html
// 配置这个,可以在控制器中获取到访问者的IP等信息,博主暂时没用到,这里做保留学习用
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
#endregion
#region 解决网站右键查看源码时,乱码问题,这个可有可无,保留做学习用
builder.Services.Configure<Microsoft.Extensions.WebEncoders.WebEncoderOptions>(options =>
{
options.TextEncoderSettings = new System.Text.Encodings.Web.TextEncoderSettings(System.Text.Unicode.UnicodeRanges.All);
});
#endregion
#region 添加日志服务
// 添加日志服务,这个需要安装 Serilog.AspNetCore 最新版 8.0.1 的组件
builder.Logging.ClearProviders();
// 配置注入
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables()
.Build();
// 日志注入
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.MinimumLevel.Override("Microsoft", LogEventLevel.Error)
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Error)
.MinimumLevel.Override("Serilog", LogEventLevel.Error)
.Enrich.FromLogContext()
.CreateLogger();
Log.Logger = logger;
builder.Logging.AddSerilog(logger);
builder.Host.UseSerilog();
#endregion
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
//app.UseDeveloperExceptionPage(); // 配置异常中间件
}
//跨域
app.UseCors("cors");
app.UseHttpsRedirection();
//添加jwt验证 这2句千万不能忘记了,顺序不能颠倒。
app.UseAuthentication();
app.UseAuthorization();
// 启用静态文件服务
app.UseStaticFiles();
app.MapControllers();
// 后台程序启动,等后面添加完应用,这个要开起来
// new ServerInit(builder.Configuration["ConnectionStrings:mysql"], builder.Configuration["ConnectionStrings:tcp"]);
app.Run();
}
}
}
此时,程序还不能正常启动,我们还需要设置一点东西,设置xml文件为“WebApplicationApi.xml”,你工程是什么名字,这个xml文件就取什么名字,这么做的目的是在启动Swagger的时候,api能够进行备注提示。

此时,运行我们的工程,你会发现,在项目目录下会生成一个WebApplicationApi.xml文件

目前安装的所有必要组件如下:
1、Microsoft.AspNetCore.Authentication.JwtBearer
2、Newtonsoft.Json
3、Quartz.Extensions.Hosting
4、Serilog.AspNetCore

到这里,我们所有基本的前期配置工作就做完了。后面开始添加我们的应用部分。