























今天在 GitHub Trending 上看到一个有意思的项目:dotnet/aspnetcore,这是微软推出的开源跨平台 Web 框架,专为云原生和现代化应用设计,支持在 Windows、macOS 和 Linux 上运行。
ASP.NET Core 是微软推出的开源、跨平台 Web 框架,用于构建现代云端连接的互联网应用程序,包括 Web 应用、IoT 应用和移动后端。该项目运行在 .NET 运行时之上,采用模块化设计,具有最小开销的组件架构。
核心特性:
适用场景:
ASP.NET Core 采用了全新的架构设计,与传统的 ASP.NET 完全不同。其核心是请求处理管道(Request Pipeline)和中间件(Middleware)系统。
请求处理流程:
请求 → Kestrel Server → 中间件1 → 中间件2 → ... → 中间件N → 控制器/页面
从源码中的 package.json 可以看出,ASP.NET Core 采用了现代化的前端工具链:
{
"engines": {
"node": ">=20.9.0",
"npm": ">=9.3.1"
},
"workspaces": [
"src/SignalR/clients/ts/signalr",
"src/SignalR/clients/ts/signalr-protocol-msgpack",
"src/JSInterop/Microsoft.JSInterop.JS/src",
"src/Components/dotnet-runtime-js",
"src/Components/Web.JS/",
"src/Components/CustomElements/src/js"
]
}
这表明 ASP.NET Core 深度融合了 TypeScript/JavaScript 生态,特别是:
服务器端:
前端集成:
从 package.json 的构建配置可以看出前端工具链的选择:
{
"devDependencies": {
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-node-resolve": "^15.2.3",
"@rollup/plugin-typescript": "^11.1.5",
"rollup": "^4.9.2",
"typescript": "^5.3.3"
}
}
使用 Rollup 作为打包工具,TypeScript 进行类型检查,说明项目重视前端代码的质量和性能。
1. 中间件模式
ASP.NET Core 的请求处理完全基于中间件:
public void Configure(IApplicationBuilder app)
{
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
2. 依赖注入模式
几乎所有服务都通过依赖注入注册:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Default")));
services.AddScoped<IRepository, Repository>();
}
3. 选项模式(Options Pattern)
用于配置管理:
services.Configure<JwtOptions>(
Configuration.GetSection("Jwt"));
以 HTTP 请求处理为例:
方式一:安装 .NET SDK
# macOS (使用 Homebrew)
brew install dotnet
# Windows (使用 Winget)
winget install Microsoft.DotNet.SDK.11
# Linux (Ubuntu/Debian)
sudo apt-get update
sudo apt-get install -y dotnet-sdk-11
方式二:下载 Nightly Builds
如果需要最新功能,可以下载每日构建版本(参考 README 中的表格):
创建并运行 Web API 项目:
# 1. 创建项目
dotnet new webapi -n MyFirstApi
cd MyFirstApi
# 2. 运行项目
dotnet run
# 3. 访问 API
curl https://localhost:5001/weatherforecast
创建一个最小 API(Minimal API):
// Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello, ASP.NET Core!");
app.MapGet("/users/{id}", (int id) =>
new User { Id = id, Name = "Cheman" });
app.Run();
record User(int Id, string Name);
运行:
dotnet run
# 访问 https://localhost:5001/
# 访问 https://localhost:5001/users/1
构建 RESTful API:
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private readonly IProductService _service;
public ProductsController(IProductService service)
{
_service = service;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<Product>>> Get()
{
return Ok(await _service.GetAllAsync());
}
[HttpGet("{id}")]
public async Task<ActionResult<Product>> Get(int id)
{
var product = await _service.GetByIdAsync(id);
if (product == null)
return NotFound();
return Ok(product);
}
[HttpPost]
public async Task<ActionResult<Product>> Post(Product product)
{
var created = await _service.CreateAsync(product);
return CreatedAtAction(nameof(Get), new { id = created.Id }, created);
}
}
使用 SignalR 实现实时通信:
从源码的 package.json 中可以看到 SignalR TypeScript 客户端的存在,说明 ASP.NET Core 对实时通信有完善支持。
服务器端:
// Hub 定义
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
// 注册 Hub
app.MapHub<ChatHub>("/chat");
客户端(TypeScript):
import * as signalR from "@microsoft/signalr";
const connection = new signalR.HubConnectionBuilder()
.withUrl("https://localhost:5001/chat")
.build();
connection.on("ReceiveMessage", (user, message) => {
console.log(`${user}: ${message}`);
});
await connection.start();
await connection.invoke("SendMessage", "Cheman", "Hello, SignalR!");
使用 Blazor 构建 SPA:
从 package.json 中的 dotnet-runtime-js 和 Web.JS 可以看出 Blazor 的 JavaScript 互操作基础设施。
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}
微服务架构中的 API 网关:
// Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
var app = builder.Build();
app.MapReverseProxy();
app.Run();
// appsettings.json
{
"ReverseProxy": {
"Routes": {
"route1": {
"ClusterId": "cluster1",
"Match": {
"PathPattern": "/api/{**catch-all}"
}
}
},
"Clusters": {
"cluster1": {
"Destinations": {
"destination1": {
"Address": "https://localhost:5002"
}
}
}
}
}
}
问题:安装 .NET SDK 后 dotnet 命令不可用
解决方案:
PATH 是否包含 .NET 安装路径/usr/local/share/dotnet 或 ~/.dotnet 在 PATH 中C:\Program Files\dotnet\ 在 PATH 中问题:Nightly Build 安装失败
从 README 的 Nightly Builds 表格可以看出,不同平台有不同的安装方式。确保下载正确的安装包:
问题:Kestrel 无法绑定端口
错误信息:Unable to bind to https://localhost:5001 on the IPv6 loopback interface
解决方案:
// Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenLocalhost(5001, options =>
{
options.UseHttps();
});
});
var app = builder.Build();
或者修改 Properties/launchSettings.json:
{
"profiles": {
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
问题:依赖注入错误
错误信息:Unable to resolve service for type 'IXXXService'
解决方案:
确保在 ConfigureServices 中注册了服务:
// 正确注册方式
services.AddScoped<IProductService, ProductService>();
// 或使用扩展方法
services.AddScoped<IProductService, ProductService>();
问题:响应速度慢
解决方案:
builder.Services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
});
app.UseResponseCompression();
builder.Services.AddOutputCache();
app.UseOutputCache();
app.MapGet("/api/products", () =>
{
// ...
}).CacheOutput();
builder.WebHost.ConfigureKestrel(options =>
{
options.ConfigureEndpointDefaults(listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
});
});
问题:从 .NET 6 升级到 .NET 11 后出现兼容性问题
解决方案:
.NET Upgrade Assistant 工具自动迁移dotnet tool install -g upgrade-assistant
upgrade-assistant upgrade MyProject.csproj
ASP.NET Core 作为微软推出的开源跨平台 Web 框架,凭借其模块化设计、高性能和强大的生态,已成为 .NET 技术栈中构建现代化应用的首选框架。
核心优势:
适用人群:
从源码分析可以看出,ASP.NET Core 在保持高性能的同时,非常重视前端工具链的现代化(TypeScript、Rollup、Workspaces),这使得它能够很好地融入现代 Web 开发生态。
如果你正在考虑使用 .NET 技术栈构建下一个项目,ASP.NET Core 绝对值得一试。其活跃的开源社区(.NET Foundation)、完善的文档和丰富的第三方库,将大大降低开发成本,提升开发效率。
项目链接: dotnet/aspnetcore
参考文档:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。