// 旧版ASP.NET Web Forms典型结构
public class Global : HttpApplication
{
void Application_Start()
{
RouteTable.Routes.Add(new Route("...", new PageRouteHandler("Default.aspx")));
}
}
// 依赖System.Web.dll,功能紧密耦合
架构问题:
System.Web
中。核心组件代码示例:
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>(); // 1. 核心入口
});
}
// Startup.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(); // 2. 模块化注册(MVC/SignalR等)
services.AddDbContext<MyDbContext>(); // 3. 数据库上下文
services.AddMemoryCache(); // 4. 缓存服务
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseRouting() // 5. 路由中间件
.UseAuthorization() // 6. 授权中间件
.UseEndpoints(endpoints =>
{
endpoints.MapControllers(); // 7. 控制器路由
});
}
}
架构优势:
// 同步阻塞代码(性能杀手)
public IActionResult GetData()
{
var data = _context.Data.Where(d => d.IsActive).ToList(); // 同步查询阻塞线程
return Ok(data);
}
// 异步优化代码
public async Task<IActionResult> GetData()
{
var data = await _context.Data.Where(d => d.IsActive).ToListAsync(); // 异步查询
return Ok(data);
}
注释解析:
async/await
:释放线程处理其他请求,避免“线程池耗尽”。public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 1. 静态文件服务(优先处理)
app.UseStaticFiles();
// 2. 路由配置
app.UseRouting();
// 3. 自定义性能监控中间件
app.UseMiddleware<PerformanceMiddleware>();
// 4. 身份验证(仅对需要的路由)
app.UseAuthentication();
// 5. 路由终结点
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
// 性能监控中间件
public class PerformanceMiddleware
{
private readonly RequestDelegate _next;
public PerformanceMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
var stopwatch = Stopwatch.StartNew();
await _next(context);
stopwatch.Stop();
// 记录API响应时间
context.Response.Headers.Add("X-Response-Time", stopwatch.Elapsed.TotalMilliseconds.ToString());
}
}
注释解析:
// 服务注册(Startup.cs)
services.AddSingleton<MySingletonService>(); // 单例
services.AddScoped<MyScopedService>(); // 请求作用域
services.AddTransient<MyTransientService>(); // 每次新实例
// 使用示例(控制器)
public class MyController : ControllerBase
{
private readonly MyScopedService _service;
public MyController(MyScopedService service) // 构造函数注入
{
_service = service;
}
[HttpGet]
public IActionResult Get()
{
return Ok(_service.GetData());
}
}
注释解析:
// 配置HTTP/3和Gzip压缩(Program.cs)
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(options =>
{
options.ListenAnyIP(5000, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http3; // 启用HTTP/3
});
});
var app = builder.Build();
app.UseResponseCompression(); // 启用响应压缩
// 配置压缩中间件
builder.Services.Configure<GzipCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Optimal;
});
builder.Services.AddResponseCompression(options =>
{
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
new[] { "application/json" }); // 扩展压缩类型
});
注释解析:
特性 | ASP.NET Core | ASP.NET |
---|---|---|
跨平台 | ✅ Windows/Linux/macOS/ARM | ❌ 仅支持Windows |
性能模型 | 异步非阻塞IO(Kestrel) | 同步阻塞IO(IIS依赖) |
依赖注入 | 内置轻量级容器 | 需第三方库(如Autofac) |
中间件 | 灵活的请求管道(中间件模式) | 固定的System.Web 管道 |
数据库访问 | 支持Entity Framework Core/ADO.NET | 依赖旧版Entity Framework |
开发工具 | 支持VS/VS Code/macOS | 仅限Visual Studio Windows |
// ASP.NET Core(控制器)
[ApiController]
[Route("[controller]")]
public class ProductsController : ControllerBase
{
[HttpGet]
public async Task<IActionResult> Get()
{
return Ok(await _repo.GetAllAsync()); // 异步操作
}
}
// 旧版ASP.NET(Web API)
public class ProductsController : ApiController
{
public IEnumerable<Product> Get()
{
return repo.GetAll(); // 同步操作
}
}
差异解析:
async
。RouteTable
。// 使用MemoryCache和Redis混合缓存
public class ProductRepository
{
private readonly IMemoryCache _memoryCache;
private readonly IDatabase _redis;
public ProductRepository(IMemoryCache memoryCache, IConnectionMultiplexer redis)
{
_memoryCache = memoryCache;
_redis = redis.GetDatabase();
}
public async Task<List<Product>> GetProductsAsync()
{
// 1. 检查本地缓存
if (_memoryCache.TryGetValue("products", out List<Product> products))
return products;
// 2. 检查Redis缓存
var redisKey = "products:cache";
var cachedProducts = await _redis.StringGetAsync(redisKey);
if (!string.IsNullOrEmpty(cachedProducts))
{
products = JsonConvert.DeserializeObject<List<Product>>(cachedProducts);
_memoryCache.Set("products", products, TimeSpan.FromMinutes(10)); // 缓存同步
return products;
}
// 3. 数据库查询
products = await _context.Products.ToListAsync();
// 4. 写入缓存
_memoryCache.Set("products", products, TimeSpan.FromMinutes(10));
await _redis.StringSetAsync(redisKey, JsonConvert.SerializeObject(products), TimeSpan.FromMinutes(10));
return products;
}
}
注释解析:
Skip/Take
结合索引,避免全表扫描。// 使用SemaphoreSlim实现API限流
public class RateLimitMiddleware
{
private readonly RequestDelegate _next;
private readonly SemaphoreSlim _semaphore = new(100, 100); // 最大并发100
public RateLimitMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
try
{
await _semaphore.WaitAsync(); // 等待信号量
await _next(context);
}
finally
{
_semaphore.Release(); // 释放信号量
}
}
}
// 注册中间件
app.UseMiddleware<RateLimitMiddleware>();
注释解析:
SemaphoreSlim
参数适配不同负载。# 使用dotnet-counters实时监控
dotnet-counters monitor -p <PID> --console
# 输出示例:
ThreadPool:Threads/WorkerThreadsCurrent: 12/250
Memory:GC Allocs/Second: 0.00
# 安装依赖库
sudo apt install -y libgdiplus libssl1.1 libicu66
# 手动指定运行时
dotnet publish -r linux-arm64 -c Release
# 配置环境变量
export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
export DOTNET_KestrelTransport=Libuv
注释解析:
libicu
:国际化支持依赖,版本需与.NET Core兼容。Libuv
:Kestrel的跨平台IO层,ARM架构需显式启用。