บทบาทของ Program.cs ใน ASP.NET Core
Program.cs เป็น Entry Point (จุดเริ่มต้น) ของแอปพลิเคชัน ASP.NET Core ซึ่งเป็น Console Application ที่โฮสต์เว็บแอปภายใน โดยมีเมธอด Main() เป็นจุดเริ่มต้นการทำงาน
โครงสร้าง Program.cs แบบ Minimal API (.NET 6+)
// .NET 6+ - Top-level statements (ไม่ต้องเขียน class Program / Main)
var builder = WebApplication.CreateBuilder(args);
// 1. Configure Services (DI Container)
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// 2. Build App
var app = builder.Build();
// 3. Configure Middleware Pipeline
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
โครงสร้าง Program.cs แบบดั้งเดิม (.NET 5 และก่อนหน้า)
// .NET 5 และก่อนหน้า
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
WebHost vs Generic Host
| ประเภท | คำอธิบาย | เวอร์ชัน |
|---|---|---|
| WebHost (IWebHost) | เฉพาะ Web Server (Kestrel, IIS) | ASP.NET Core 1.x - 2.x |
| Generic Host (IHost) | รองรับทั้ง Web และ Non-Web (Worker, Console) | ASP.NET Core 3.0+ |
CreateDefaultBuilder() ทำอะไรบ้าง?
เมธอด Host.CreateDefaultBuilder(args) (หรือ WebApplication.CreateBuilder(args)) กำหนดค่า Default ดังนี้:
- Content Root = Current Directory
- Configuration โหลดจาก:
appsettings.jsonappsettings.{Environment}.json(เช่น appsettings.Development.json)- Environment Variables
- Command Line Arguments
- User Secrets (Development only)
- Logging - Console, Debug, EventSource
- Dependency Injection - Built-in Container
- Kestrel Web Server - โหลด config จาก configuration
- IIS Integration - สำหรับโฮสต์บน IIS
- Routing, Authorization, Endpoints
เมธอดสำคัญใน WebApplicationBuilder / IHostBuilder
| เมธอด | หน้าที่ |
|---|---|
ConfigureServices / builder.Services | ลงทะเบียน DI Services (AddScoped, AddTransient, AddSingleton) |
Configure / app.Use... | กำหนด Middleware Pipeline |
UseStartup<T>() | ระบุ Startup class (แบบเก่า) |
UseKestrel() | ตั้งค่า Kestrel Server |
UseIISIntegration() | รองรับ IIS Reverse Proxy |
UseContentRoot() | ตั้งค่า Content Root Path |
UseUrls() | ตั้งค่า URL/Port ที่ Listen |
Build() | สร้าง IHost / WebApplication instance |
Run() | รันแอป บล็อก thread จนกว่าจะ Shutdown |
RunAsync() | รันแบบ Async |
ตัวอย่างการตั้งค่าขั้นสูง
var builder = WebApplication.CreateBuilder(args);
// Custom Configuration
builder.Configuration
.AddJsonFile("custom-settings.json", optional: true)
.AddEnvironmentVariables(prefix: "MYAPP_");
// Custom Kestrel Config
builder.WebHost.ConfigureKestrel(options =>
{
options.ListenLocalhost(5000); // HTTP
options.ListenLocalhost(5001, listenOptions =>
{
listenOptions.UseHttps(); // HTTPS
});
options.Limits.MaxRequestBodySize = 10 * 1024 * 1024; // 10MB
});
// Custom Services
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => { /* config */ });
var app = builder.Build();
// Middleware Pipeline Order สำคัญ!
app.UseExceptionHandler("/error"); // บนสุด
app.UseHsts(); // HSTS
app.UseHttpsRedirection(); // Redirect HTTP -> HTTPS
app.UseStaticFiles(); // Static files (wwwroot)
app.UseRouting(); // Routing
app.UseAuthentication(); // AuthN
app.UseAuthorization(); // AuthZ
app.MapControllers(); // Endpoints
app.MapHealthChecks("/health"); // Health checks
app.Run();
Middleware Pipeline Order (ลำดับสำคัญ)
UseExceptionHandler/UseDeveloperExceptionPageUseHsts/UseHttpsRedirectionUseStaticFilesUseRoutingUseAuthenticationUseAuthorizationMapControllers/MapRazorPages/MapGet(Endpoints)
สรุป
- Program.cs = Entry Point ของแอป ASP.NET Core
- .NET 6+ ใช้ Top-level statements ลดโค้ด Boilerplate
- CreateDefaultBuilder ตั้งค่า Defaults ทั้งหมด (Config, Logging, DI, Kestrel, IIS)
- 2 ส่วนหลัก: Configure Services (DI) + Configure Middleware Pipeline
- ลำดับ Middleware สำคัญมาก - ผิดลำดับ = Bug ยากหา