Scalar là gì? Tại sao nên dùng Scalar thay Swagger UI trong ASP.NET Core 10
Scalar là open-source API Reference UI thay thế Swagger UI, được Microsoft khuyến nghị cho ASP.NET Core từ .NET 9 trở đi. Kể từ .NET 9, Microsoft loại bỏ Swashbuckle (Swagger UI) khỏi template mặc định của Web API và thay bằng Microsoft.AspNetCore.OpenApi kết hợp với Scalar. Bài viết này giải thích lý do thay đổi đó, so sánh tính năng Scalar vs Swagger UI, và hướng dẫn thiết lập Scalar trong ASP.NET Core 10 từng bước - từ project mới lẫn migration từ dự án cũ.
Nếu bạn tạo một project ASP.NET Core Web API mới với .NET 9 hoặc .NET 10 và ngạc nhiên khi không thấy Swagger UI nữa - bạn không phải người duy nhất. Microsoft đã chủ động thay thế Swashbuckle bằng một pipeline OpenAPI native, và Scalar là UI được khuyến nghị đi kèm.
Tóm tắt nhanh (TL;DR)
- .NET 9+: Microsoft loại bỏ Swashbuckle khỏi template
dotnet new webapi - Thay thế:
Microsoft.AspNetCore.OpenApi(sinh document) +Scalar.AspNetCore(UI) - OpenAPI JSON giờ ở
/openapi/v1.jsonthay vì/swagger/v1/swagger.json - Scalar UI truy cập tại
/scalar/v1 - Migration từ Swashbuckle mất khoảng 15-30 phút
Tại sao Microsoft bỏ Swagger UI (Swashbuckle)?
Swashbuckle là thư viện bên thứ ba, không còn được maintain tích cực
Swashbuckle.AspNetCore là package c ủa cộng đồng, không phải của Microsoft. Từ .NET 9, Microsoft quyết định cần một giải pháp first-party tích hợp sâu vào pipeline ASP.NET Core thay vì phụ thuộc vào package ngoài với vòng đời bảo trì không đảm bảo.
Microsoft.OpenApi v2 là breaking change khiến Swashbuckle không tương thích
Microsoft.OpenApi phiên bản 2.x đi kèm .NET 10 có breaking change hoàn toàn so với v1.x mà Swashbuckle 6.x - 9.x phụ thuộc. Swashbuckle không thể build sạch trên .NET 10 vì object model mới không tương thích ngược.
Native OpenAPI pipeline sinh OpenAPI 3.1 chuẩn hơn
Microsoft.AspNetCore.OpenApi - package đi kèm từ .NET 9 - sinh ra OpenAPI 3.1 trực tiếp từ metadata của endpoint. Không cần reflection phức tạp, hỗ trợ Native AOT đầy đủ, tích hợp hoàn hảo với Minimal APIs và Controller-based APIs.
Không. Swashbuckle vẫn là community package và vẫn hoạt động trên .NET 10. Điều thay đổi là nó không còn nằm trong template mặc định nữa - bạn phải tự opt-in nếu muốn dùng.
Scalar là gì?
Scalar là open-source API Reference UI, đọc OpenAPI 3.1 và render thành giao diện tài liệu API tương tác. Scalar được tích hợp vào ASP.NET Core qua NuGet package Scalar.AspNetCore.
Scalar không chỉ là "Swagger UI đẹp hơn" mà có thêm nhiều tính năng nổi bật:
- Dark mode tích hợp sẵn - không cần theme tùy chỉnh
- 11 built-in themes (
moon,purple,solarized,deepSpace,laserwave...) - API Client tích hợp: lịch sử request, environment variables, code snippet 25+ ngôn ngữ
- Sidebar navigation cho API có nhiều endpoint
- Full-text search tích hợp sẵn (Swagger UI cần plugin riêng)
- CORS Proxy để tránh lỗi khi test cross-origin API
So sánh Scalar vs Swagger UI
| Tính năng | Scalar | Swagger UI |
|---|---|---|
| OpenAPI 3.1 | ✅ | ✅ |
| OpenAPI 3.2 | 🔄 đang phát triển | ❌ không có kế hoạch |
| .NET 9/10 native pipeline | ✅ | ❌ |
| Dark mode | ✅ | ❌ |
| Built-in themes | 11 themes | ❌ |
| Sidebar navigation | ✅ | ❌ |
| Full-text search | ✅ tích hợp sẵn | ⚠️ cần plugin |
| Code snippet generation | 25+ ngôn ngữ | ⚠️ hạn chế |
| Vue component | ✅ | ❌ |
| CORS Proxy | ✅ | ❌ |
| Desktop API Client | ✅ | ❌ |
| PRs merged 2025 | 2.075 | 176 |
Kết luận: Scalar có community hoạt động tích cực hơn (~12x số PR merged trong 2025), nhiều tính năng hơn, v à được Microsoft chọn làm UI mặc định cho ASP.NET Core từ .NET 9.
Cách thiết lập Scalar trên ASP.NET Core 10 (từ đầu)
Bước 1: Tạo project Web API mới
dotnet new webapi -n MyApi
cd MyApi
Với .NET 10, template đã tích hợp sẵn Microsoft.AspNetCore.OpenApi. Chỉ cần thêm Scalar:
dotnet add package Scalar.AspNetCore
Bước 2: Cấu hình Program.cs
using Scalar.AspNetCore;
var builder = WebApplication.CreateBuilder(args);
// Đăng ký OpenAPI document generation
builder.Services.AddOpenApi();
var app = builder.Build();
// Chỉ expose docs trong môi trường Development
if (app.Environment.IsDevelopment())
{
app.MapOpenApi(); // sinh /openapi/v1.json
app.MapScalarApiReference(); // render UI tại /scalar/v1
}
app.UseHttpsRedirection();
// Ví dụ Minimal API
app.MapGet("/products", () =>
Results.Ok(new[]
{
new { Id = 1, Name = "Laptop", Price = 25_000_000 },
new { Id = 2, Name = "Mouse", Price = 350_000 }
})
)
.WithName("GetProducts")
.WithSummary("Lấy danh sách sản phẩm")
.WithDescription("Trả về toàn bộ danh sách sản phẩm hiện có trong hệ thống.");
app.Run();
Sau khi chạy, truy cập:
| URL | Mô tả |
|---|---|
https://localhost:{port}/openapi/v1.json | File OpenAPI JSON |
https://localhost:{port}/scalar/v1 | Scalar UI |
