.NET 的重生:從 Windows only 到真正的跨平台
2016 年之前,ASP.NET 是 Windows + IIS 的組合,Java / Node.js 的工程師不太需要關心它。
.NET Core(2016)和後來的 .NET 5/6(2020/2021)改變了這個格局:
- 跨平台:Linux、macOS、Docker 原生支援
- 效能:Kestrel HTTP server 在 TechEmpower benchmark 長期是最快的幾個之一
- Minimal API(.NET 6):API 寫法從 MVC Controller 簡化到類似 Express / Fastify 的風格
- proto:我們的
proto2661047/b2e/aspnet-core有完整實作
現在的 ASP.NET Core 不再只是「微軟生態」的選擇——它是效能和開發體驗都值得認真考慮的框架。
MVC Controller 風格(傳統)
ASP.NET Core 的 MVC Controller 設計和 Spring Boot 很像:
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
private readonly UserService _userService;
public UsersController(UserService userService)
{
_userService = userService;
}
[HttpGet("{id}")]
public async Task<ActionResult<UserDto>> Show(int id)
{
var user = await _userService.FindByIdAsync(id);
if (user == null) return NotFound();
return Ok(user);
}
[HttpPost]
public async Task<ActionResult<UserDto>> Create([FromBody] CreateUserDto dto)
{
// [FromBody] + model validation 自動進行(Data Annotations)
var user = await _userService.CreateAsync(dto);
return CreatedAtAction(nameof(Show), new { id = user.Id }, user);
}
}C# 的 [ApiController] attribute 讓 model validation 自動生效——如果 CreateUserDto 有 [Required] / [EmailAddress] annotation,格式不對就直接 400。
DI 是 .NET 的一等公民——builder.Services.AddScoped<UserService>() 加一行,framework 就管注入了。
Minimal API(.NET 6+):Express 風格
.NET 6 引入了 Minimal API,讓寫法大幅簡化:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<UserService>();
var app = builder.Build();
app.MapGet("/users/{id}", async (int id, UserService userService) =>
{
var user = await userService.FindByIdAsync(id);
return user is null ? Results.NotFound() : Results.Ok(user);
});
app.MapPost("/users", async (CreateUserDto dto, UserService userService) =>
{
var user = await userService.CreateAsync(dto);
return Results.Created($"/users/{user.Id}", user);
});
app.Run();Minimal API 的 DI 直接放在 lambda 參數——(int id, UserService userService) 裡,int id 從 route path 取,UserService userService 從 DI container 取,不需要任何 attribute 聲明。
這讓小型 API 的程式碼量和 Fastify / Hono 差不多少,但保有 C# 的完整型別系統。
缺點:Minimal API 對大型系統的組織還沒有強制 convention——每個人組織方式可能不同。通常大型系統還是用 Controller 風格,Minimal API 適合小型 service 或 microservice。
Orleans:分散式 Actor 模型
Orleans(2014,Microsoft Research)是一個不一樣的東西——不是 HTTP API framework,而是 virtual actor 模型:
// Grain interface
public interface IUserGrain : IGrainWithIntegerKey
{
Task<UserState> GetState();
Task UpdateEmail(string email);
}
// Grain 實作
public class UserGrain : Grain, IUserGrain
{
private UserState _state = new();
public Task<UserState> GetState() => Task.FromResult(_state);
public Task UpdateEmail(string email)
{
_state = _state with { Email = email };
return Task.CompletedTask;
}
}
// Client 呼叫(透過 Orleans cluster,不管 Grain 在哪台機器)
var userGrain = client.GetGrain<IUserGrain>(userId);
await userGrain.UpdateEmail("new@example.com");Orleans 的設計讓你用操作本地物件的方式去操作分散式系統上的 actor——Orleans 負責位置透明性(location transparency)、activation、deactivation、state persistence。
這不是一般 API 開發的選擇,是遊戲 backend(Xbox、Halo 後端用 Orleans)、IoT device state 管理、real-time 狀態系統等場景。
選擇決策
一般的 REST API + 企業應用?
→ ASP.NET Core MVC Controller
小型 service / microservice,想要 Express-like 寫法?
→ Minimal API
分散式 actor 系統(遊戲 / IoT / real-time state)?
→ Orleans
效能最高的組合?
→ Minimal API + Kestrel(benchmark 最強)
.NET 生態在 2026 的狀況是:效能很強(Kestrel 在 benchmark 裡名列前茅)、開發體驗因為 C# 的型別系統而相當好、跨平台和 Docker 支援完整。如果你的 proto 有 proto2661047/b2e/aspnet-core,它的架構設計可以對照這篇的框架定位一起看。
