本文章翻译自微软官方文档: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/?view=aspnetcore-7.0&tabs=windows
目录
ASP.NET Core基础知识概述(一)
ASP.NET Core基础知识概述(二)
ASP.NET Core基础知识概述(三)
服务器(Servers)
ASP.NET Core应用使用HTTP server实现对HTTP请求的监听。服务器对应用的请求在表面上呈现为一组由 HttpContext 组成的请求功能。
对Windows操作系统来说
ASP.NET Core提供一下服务器实现:
- Kestrel是一个跨平台的web服务器。Kestrel通常运行在配置了方向代理的IIS中。在ASP.NET Core 2.0或更高版本中,Kestrel可直接作为面向公众的边界服务并直接向Internet公开。
- IIS HTTP 服务器适用于使用 IIS 的 Windows。借助此服务器,ASP.NET Core应用和IIS运行在同一进程中。
- HTTP.sys是适用于不与 IIS 一起使用的 Windows 的服务器。
对macOS及Linux操作系统来说
ASP.NET Core提供Kestrel跨平台服务器的实现。在ASP.NET Core 2.0或更高版本中,Kestrel可直接作为面向公众的边界服务并直接向Internet公开。Kestrel通常运行在配置了方向代理的 Nginx 或Apache中。
配置(Configuration)
ASP.NET Core 提供了一个配置框架,这个框架可以从配置提供程序的有序集中获取或设置键值对。内置的配置提供程序支持很多配置源,比如json文件、xml文件、环境变量和命令行参数。也可以自定义配置提供程序以支持其他配置源。
默认情况下,ASP.NET Core会从appsettings.json文件、环境变量及命令行等中读取配置。当应用程序的配置已加载,环境变量中的配置将会覆盖appsettings.json文件中的配置。
环境(Environments)
运行环境(比如Development、Staging和Production)在ASP.NET Core中是可使用的。通过设置ASPNETCORE_ENVIRONMENT环境变量来指定应用的运行环境。ASP.NET Core在应用启动是读取该环境变量并存储在IWebHostEnvironment的实现中。通过依赖注入(DI),此实现可在应用的任何地方使用。
一下代码示例中实现通过判断不是Development环境来配置异常处理(exception handler)及 HTTP Strict Transport Security Protocol (HSTS) 中间件:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapGet("/hi", () => "Hello!");
app.MapDefaultControllerRoute();
app.MapRazorPages();
app.Run();
日志(Logging)
ASP.NET Core 支持适用于各种内置和第三方Logging提供程序的Logging API。包括以下Logging提供程序:
- Console
- Debug
- Event Tracing on Windows
- Windows Event Log
- TraceSource
- Azure App Service
- Azure Application Insights
想要记录日志,可以从DI中解析 ILogger<TCategoryName>服务并调用Logging的相关方法,比如LogInformation方法。看以下代码示例:
public class IndexModel : PageModel
{
private readonly RazorPagesMovieContext _context;
private readonly ILogger<IndexModel> _logger;
public IndexModel(RazorPagesMovieContext context, ILogger<IndexModel> logger)
{
_context = context;
_logger = logger;
}
public IList<Movie> Movie { get;set; }
public async Task OnGetAsync()
{
_logger.LogInformation("IndexModel OnGetAsync.");
Movie = await _context.Movie.ToListAsync();
}
}