using HtmlToPdfService.Core.Options;
using HtmlToPdfService.Core.Pool;
using HtmlToPdfService.Core.Services;
using HtmlToPdfService.Core.Storage;
var builder = WebApplication.CreateBuilder(args);
// 配置日志
builder.Logging.ClearProviders();
builder.Logging.AddConsole();
builder.Logging.AddDebug();
// 绑定配置选项
builder.Services.Configure(
builder.Configuration.GetSection("PdfService"));
// 注册服务
builder.Services.AddSingleton();
builder.Services.AddSingleton();
builder.Services.AddScoped();
builder.Services.AddScoped();
builder.Services.AddScoped();
// 注册 HttpClient Factory(用于回调)
builder.Services.AddHttpClient("CallbackClient")
.ConfigureHttpClient(client =>
{
client.Timeout = TimeSpan.FromSeconds(30);
});
// 添加控制器
builder.Services.AddControllers();
// 添加 API 文档
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// 添加 CORS
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(policy =>
{
policy.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
var app = builder.Build();
// 配置 HTTP 请求管道
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "HTML to PDF Service API v1");
});
}
app.UseCors();
app.MapControllers();
// 启动时预热浏览器池
var lifetime = app.Services.GetRequiredService();
lifetime.ApplicationStarted.Register(async () =>
{
var logger = app.Services.GetRequiredService>();
logger.LogInformation("应用程序已启动,开始预热浏览器池...");
try
{
var browserPool = app.Services.GetRequiredService();
await browserPool.WarmUpAsync();
logger.LogInformation("浏览器池预热完成");
}
catch (Exception ex)
{
logger.LogError(ex, "浏览器池预热失败");
}
});
// 优雅关闭
lifetime.ApplicationStopping.Register(async () =>
{
var logger = app.Services.GetRequiredService>();
logger.LogInformation("应用程序正在停止,清理资源...");
try
{
var browserPool = app.Services.GetRequiredService();
await browserPool.DisposeAsync();
logger.LogInformation("浏览器池已清理");
}
catch (Exception ex)
{
logger.LogError(ex, "清理浏览器池时出错");
}
});
var logger = app.Services.GetRequiredService>();
logger.LogInformation("HTML to PDF Service 已启动");
logger.LogInformation("Swagger UI: http://localhost:5000/swagger");
app.Run();