using Gatedge.ScanCode.Common;
using Gatedge.ScanCode.Extension;
using Gatedge.ScanCode.Middleware;
using Gatedge.ScanCode.Options;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.FileProviders;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.IO;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Unicode;
namespace Gatedge.ScanCode
{
///
/// 主程序
///
public class Program
{
///
/// main方法
///
///
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// 配置K3CloudApi类
builder.Services.AddConfigureK3CloudApi(builder.Configuration);
// 配置Jwt
builder.Services.ConfigureJwtContext(builder.Configuration);
// 配置文件
builder.Services.AddConfigureK3FileService(builder.Configuration);
// 配置json
//builder.Services.ConfigureServices();
// 添加Services
builder.Services.ConfigureCore();
// 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(option =>
{
option.AddSecurityRequirement(new OpenApiSecurityRequirement()
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Id = "Bearer",
Type = ReferenceType.SecurityScheme
}
},
new List()
}
});
// 添加Bearer认证
option.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
Scheme = "Bearer"
});
// 输出swagger注释
var basePath = AppContext.BaseDirectory;
var xmlPath = Path.Combine(basePath, "Gatedge.ScanCode.xml");
option.IncludeXmlComments(xmlPath);
});
builder.Logging.AddProvider(new FileLoggerProvider(
filePath: "../logs/app.log", // 日志文件路径
maxFileSize: 10 * 1024 * 1024, // 10MB
maxRetainedFiles: 1000 // 保留最近1000个滚动文件
));
builder.Services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;//解决后端传到前端全大写
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);//解决后端返回数据中文被编码
});
var app = builder.Build();
app.UseStaticFiles();
var filePath = Path.Combine(builder.Environment.ContentRootPath, "K3CloudFile");
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
var fileProvider = new PhysicalFileProvider(filePath);
var provider = new FileExtensionContentTypeProvider();
provider.Mappings[".apk"] = "application/vnd.android.package-archive";
provider.Mappings[".wgt"] = "application/widget";
var requestPath = "/Download";
// Enable displaying browser links.
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = fileProvider,
RequestPath = requestPath,
ContentTypeProvider = provider
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = fileProvider,
RequestPath = requestPath,
});
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
/*
中间件注册顺序影响执行顺序,注册顺序 = 执行顺序,异常处理中间件应该放在最后
*/
// 1.先授权、再认证
app.UseAuthentication(); //认证中间件
app.UseAuthorization(); //授权中间件
// 日志中间件
app.UseMiddleware();
// 全局异常中间件
app.UseMiddleware();
//app.UseHttpsRedirection(); // 转发HTTP到HTTPS
app.MapControllers();
app.Run();
}
}
}