Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

ไฟล์ Program.cs ในโปรเจกต์ C# ASP.NET Core ทำหน้าที่อะไร

บทบาทของ 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.json
    • appsettings.{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 (ลำดับสำคัญ)

  1. UseExceptionHandler / UseDeveloperExceptionPage
  2. UseHsts / UseHttpsRedirection
  3. UseStaticFiles
  4. UseRouting
  5. UseAuthentication
  6. UseAuthorization
  7. MapControllers / 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 ยากหา