0Pricing
C# Academy · บทเรียน

ลำดับมิดเดิลแวร์และมิดเดิลแวร์ในตัว

ทำความเข้าใจการจัดลำดับมิดเดิลแวร์ที่ถูกต้องสำหรับการพิสูจน์ตัวตน การกำหนดเส้นทาง CORS และการจัดการข้อยกเว้น

ลำดับมิดเดิลแวร์และมิดเดิลแวร์ในตัว เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดลำดับจึงสำคัญ

มิดเดิลแวร์ ASP.NET Core ทำงานตามลำดับที่ลงทะเบียนไว้อย่างเคร่งครัด ลำดับที่ไม่ถูกต้องทำให้เกิดช่องโหว่ด้านความปลอดภัย ปัญหาด้านประสิทธิภาพ หรือพฤติกรรมที่ผิดพลาด ตัวอย่างเช่น การกำหนดเส้นทางต้องมาก่อนการอนุญาตสิทธิ์ และการอนุญาตสิทธิ์ต้องมาก่อนการประมวลผลจุดปลายทาง

ลำดับมิดเดิลแวร์ที่แนะนำ

Microsoft จัดทำเอกสารลำดับที่แนะนำสำหรับมิดเดิลแวร์ การเบี่ยงเบนจากลำดับนี้ทำให้เกิดปัญหาที่แกะรอยได้ยาก ต่อไปนี้คือลำดับมาตรฐานสำหรับ API ASP.NET Core ที่ใช้งานจริง

// Recommended order:
app.UseExceptionHandler();    // 1. Catch all exceptions
app.UseHsts();                // 2. HTTP Strict Transport Security
app.UseHttpsRedirection();    // 3. Redirect HTTP to HTTPS
app.UseStaticFiles();         // 4. Serve static assets
app.UseRouting();             // 5. Match route patterns
app.UseCors();                // 6. Cross-Origin
app.UseAuthentication();      // 7. Who are you?
app.UseAuthorization();       // 8. Are you allowed?
app.UseRateLimiter();         // 9. Throttle
app.UseOutputCache();         // 10. Cache responses
// Map endpoints here
app.MapControllers();
app.Run();

การจัดการข้อยกเว้นต้องมาก่อน

มิดเดิลแวร์จัดการข้อยกเว้นต้องอยู่เป็นอันดับแรก ซึ่งเป็นชั้นนอกสุด เพื่อให้ดักจับข้อยกเว้นจากมิดเดิลแวร์และจุดปลายทางทั้งหมดที่ทำงานภายหลังได้

// Development: detailed error page
if (app.Environment.IsDevelopment())
    app.UseDeveloperExceptionPage();
else
{
    // Production: generic error page + structured response
    app.UseExceptionHandler("/error");
    app.UseHsts();
}

// OR: use ProblemDetails globally (recommended .NET 8+)
builder.Services.AddProblemDetails();
app.UseExceptionHandler();
// All unhandled exceptions -> RFC 7807 ProblemDetails JSON

ไฟล์สแตติกต้องมาก่อนการกำหนดเส้นทาง

ไฟล์สแตติก (UseStaticFiles) ควรอยู่ก่อนการกำหนดเส้นทาง การส่งไฟล์สแตติกจะหยุดไปป์ไลน์ก่อนถึงส่วนถัดไป จึงไม่จำเป็นต้องเรียกใช้การยืนยันตัวตนหรือการกำหนดเส้นทางสำหรับ /css/main.css

app.UseStaticFiles(); // serves wwwroot/* without going through auth
app.UseRouting();     // expensive: runs route matching

// If you put UseStaticFiles AFTER UseRouting, the route
// matcher runs unnecessarily for every .js/.css request.
// Serve static files first for better performance.

การยืนยันตัวตนต้องมาก่อนการอนุญาตสิทธิ์

UseAuthentication ต้องอยู่ก่อน UseAuthorization การยืนยันตัวตนจะเติมข้อมูลลงใน HttpContext.User จากนั้นการอนุญาตสิทธิ์จะตรวจสอบผู้ใช้ที่มีข้อมูลแล้วกับนโยบายต่าง ๆ

// WRONG ORDER — authorization runs before user is populated:
app.UseAuthorization();  // user is null → everything allowed!
app.UseAuthentication(); // too late

// CORRECT:
app.UseAuthentication(); // populates context.User
app.UseAuthorization();  // checks context.User against policies

CORS ก่อนการยืนยันตัวตน

มิดเดิลแวร์ CORS ต้องทำงานก่อนการยืนยันตัวตน เพื่อให้คำขอ OPTIONS แบบตรวจสอบล่วงหน้าได้รับการจัดการโดยไม่ต้องใช้ส่วนหัวการยืนยันตัวตน

builder.Services.AddCors(opts =>
    opts.AddPolicy("Frontend", p =>
        p.WithOrigins("https://myapp.com")
         .AllowAnyHeader()
         .AllowAnyMethod()));

app.UseRouting();
app.UseCors("Frontend"); // before auth — handles OPTIONS pre-flight
app.UseAuthentication();
app.UseAuthorization();

มิดเดิลแวร์ในตัวที่ใช้บ่อย

ASP.NET Core มีมิดเดิลแวร์ในตัวจำนวนมาก การทราบว่าแต่ละตัวทำหน้าที่อะไรจะช่วยให้คุณเข้าใจว่าควรใช้มิดเดิลแวร์เหล่านั้นเมื่อใดและอย่างไร

// Compression: compresses responses (must be before static files)
builder.Services.AddResponseCompression();
app.UseResponseCompression();

// Request localization: sets culture from Accept-Language header
builder.Services.AddLocalization();
app.UseRequestLocalization();

// Health checks: /health endpoint
builder.Services.AddHealthChecks();
app.MapHealthChecks("/health");

// Forwarded headers: trust X-Forwarded-For from reverse proxy
app.UseForwardedHeaders();

เจาะลึกมิดเดิลแวร์สำหรับการกำหนดเส้นทาง

UseRouting() จับคู่คำขอขาเข้ากับรูปแบบเส้นทางและเก็บผลการจับคู่ไว้ใน HttpContext จากนั้น UseEndpoints() (หรือ MapXxx()) จะดำเนินการกับจุดปลายทางที่จับคู่ได้

app.UseRouting(); // matches route, stores in context

// Between UseRouting and Map*: middleware can read route data
app.Use(async (ctx, next) =>
{
    var endpoint = ctx.GetEndpoint();
    var routeName = endpoint?.DisplayName;
    Console.WriteLine($"Matched: {routeName}");
    await next(ctx);
});

// All auth and other middleware go here
app.UseAuthentication();
app.UseAuthorization();

// Execute the matched endpoint
app.MapControllers();
app.MapGet("/", () => "Home");

การวางมิดเดิลแวร์บีบอัดการตอบกลับ

มิดเดิลแวร์บีบอัดการตอบกลับต้องอยู่ ก่อน ไฟล์สแตติกและการกำหนดเส้นทาง เพื่อให้เขียนผลลัพธ์ที่บีบอัดแล้วก่อนสร้างเนื้อหา ควรวางไว้ทันทีหลังการจัดการข้อยกเว้น

// Correct placement for response compression:
app.UseExceptionHandler();
app.UseResponseCompression(); // before static files
app.UseStaticFiles();          // compressed static files
app.UseRouting();
// ... rest of pipeline

ตัวอย่างการใช้งานจริง: ลำดับมิดเดิลแวร์สำหรับระบบจริงแบบครบถ้วน

ลำดับการประมวลผลสำหรับระบบจริงแบบครบถ้วน ซึ่งรวมคำแนะนำทั้งหมดไว้ในชุดมิดเดิลแวร์ที่จัดเรียงอย่างเหมาะสมและปลอดภัย

var app = builder.Build();

if (app.Environment.IsDevelopment())
    app.UseDeveloperExceptionPage();
else { app.UseExceptionHandler(); app.UseHsts(); }

app.UseResponseCompression();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCors("AllowFrontend");
app.UseAuthentication();
app.UseAuthorization();
app.UseRateLimiter();
app.UseOutputCache();

app.MapHealthChecks("/health").AllowAnonymous();
app.MapControllers();

app.Run();

ตรวจสอบความเข้าใจ

เหตุใด UseAuthentication จึงต้องทำงานก่อน UseAuthorization ในลำดับการประมวลผลของมิดเดิลแวร์

สรุป: ลำดับมิดเดิลแวร์และมิดเดิลแวร์ในตัว

ประเด็นสำคัญ:

  • จัดการข้อยกเว้นก่อน ไฟล์สแตติกก่อนการกำหนดเส้นทาง การยืนยันตัวตนก่อนการอนุญาต และ CORS ก่อนการยืนยันตัวตน
  • วางการบีบอัดการตอบกลับไว้ช่วงต้น (ก่อนไฟล์สแตติก) เพื่อให้มีประสิทธิภาพสูงสุด
  • UseRouting + UseAuthorization + Map* — มิดเดิลแวร์ที่อยู่ระหว่างองค์ประกอบเหล่านี้สามารถอ่านข้อมูลเส้นทางได้
  • มิดเดิลแวร์ในตัว: UseHsts, UseHttpsRedirection, UseStaticFiles, UseRateLimiter, UseOutputCache
  • ตรวจสอบ ctx.GetEndpoint() ระหว่าง UseRouting และ MapXxx เพื่ออ่านข้อมูลเส้นทางที่จับคู่ได้

คำถามที่พบบ่อย

บทเรียน “ลำดับมิดเดิลแวร์และมิดเดิลแวร์ในตัว” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ลำดับมิดเดิลแวร์และมิดเดิลแวร์ในตัว” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ลำดับมิดเดิลแวร์และมิดเดิลแวร์ในตัว”

ทำความเข้าใจการจัดลำดับมิดเดิลแวร์ที่ถูกต้องสำหรับการพิสูจน์ตัวตน การกำหนดเส้นทาง CORS และการจัดการข้อยกเว้น คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ลำดับมิดเดิลแวร์และมิดเดิลแวร์ในตัว” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ภาพรวมสายงาน ASP.NET Core
  2. การเขียนมิดเดิลแวร์แบบกำหนดเอง
  3. การตัดการทำงานระยะสั้นและการแตกแขนง
  4. ลำดับมิดเดิลแวร์และมิดเดิลแวร์ในตัว
← กลับไปที่ C# Academy