ASP.NET Core面试精讲系列一_asp.net core 3
haoteby 2025-10-02 19:13 19 浏览
1.ASP.NET Core 中的中间件是什么?
中间件是 HTTP 请求管道中的一个组件,可以:
-
处理请求,
-
将请求传递给下一个中间件,
-
或者中断管道(短路)。
-
中间件可以在下一个中间件执行前后执行操作,如日志、认证、错误处理等。
-
中间件按照在 Program.cs 中添加的顺序执行。
2. 如何配置中间件管道(在 Program.cs / Startup.cs 中)?
-
在 ASP.NET Core 6+(最小主机模型)中,中间件在 Program.cs 中添加:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build;
app.UseMiddleware
app.UseRouting;
app.UseEndpoints(endpoints => { endpoints.MapControllers; });
app.Run;
- 在旧版本(例如 .NET Core 3.1)中,使用 Startup.cs:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMiddleware
app.UseRouting;
app.UseEndpoints(endpoints => { endpoints.MapControllers; });
}
3. app.Use、app.UseMiddleware、app.Run 和 app.Map 的区别**
方法 | 说明 |
---|---|
app.Use | 添加可以调用 next 的中间件 |
app.UseMiddleware | 添加自定义中间件类 |
app.Run | 终止中间件,不调用 next,结束管道 |
app.Map | 根据 URL 路径分支管道(如 /api) |
示例:
app.Use(async (context, next) => {
await next; // 调用下一个中间件
});
app.Run(async context => {
await context.Response.WriteAsync("Hello World"); // 终止管道
});
4. 如何编写自定义中间件?
-
创建一个类,构造函数接收 RequestDelegate,包含 Invoke 或 InvokeAsync 方法。
public class MyCustomMiddleware
{
private readonly RequestDelegate _next;
public MyCustomMiddleware(RequestDelegate next) => _next = next;
public async Task InvokeAsync(HttpContext context)
{
// 前置逻辑
await _next(context);
// 后置逻辑
}
}
5. 什么是 RequestDelegate?
-
RequestDelegate 是一个委托,表示管道中的下一个中间件。
public delegate Task RequestDelegate(HttpContext context);
6. 中间件顺序为什么重要?
-
中间件按添加顺序执行,顺序会影响行为。
- 例如:
app.UseAuthentication
必须在授权之前。 -
日志、错误处理、安全中间件应放在管道前面。
7. 如何短路管道?
if (!context.User.Identity.IsAuthenticated)
{
context.Response.StatusCode = 401;
return; // 短路
}
await next; // 仅认证通过时调用
8. UseStaticFiles 的作用及其在管道中的位置
-
app.UseStaticFiles
用于从 wwwroot 提供静态文件。 -
必须在路由或 endpoints 之前添加,否则静态文件会被控制器逻辑处理。
9. 如何使用中间件处理异常(UseExceptionHandler, UseDeveloperExceptionPage)
-
UseDeveloperExceptionPage
:开发环境显示详细错误。 -
UseExceptionHandler("/Error")
:生产环境自定义错误页面。 -
也可内联处理:
app.UseExceptionHandler(errorApp => {
errorApp.Run(async context => {
context.Response.StatusCode = 500;
await context.Response.WriteAsync("An error occurred");
});
});
10. 如何启用 HTTPS 重定向中间件
-
app.UseHttpsRedirection;
将 HTTP 请求重定向到 HTTPS。 -
应在认证或路由之前添加。
-
HTTPS 端口可在 launchSettings.json 或 appsettings.json 配置。
11. 如何使用自定义文件提供程序或选项(如缓存、目录浏览)提供静态文件?**
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "MyFiles")),
RequestPath = "/Files",
OnPrepareResponse = ctx => {
ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=600");
}
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = new PhysicalFileProvider("path"),
RequestPath = "/browse"
});
12. 终止中间件与非终止中间件的区别**
类型 | 说明 |
---|---|
终止(Terminal) | 结束管道,不调用 next,如 app.Run |
非终止(Non-Terminal) | 调用 next,允许后续中间件执行,如 app.Use |
13. 如何集成认证/授权中间件**
-
app.UseAuthentication;
验证用户身份 -
app.UseAuthorization;
应用策略/角色 -
顺序:路由后,endpoints 前
14. 如何通过中间件启用和配置 CORS
builder.Services.AddCors(options => {
options.AddPolicy("MyPolicy", policy => {
policy.WithOrigins("https://example.com")
.AllowAnyHeader
.AllowAnyMethod;
});
});
- 使用中间件:
app.UseCors("MyPolicy");
,应在路由/endpoints 之前
15. 使用中间件进行日志或性能监控(如测量执行时间)**
public class TimingMiddleware
{
private readonly RequestDelegate _next;
public TimingMiddleware(RequestDelegate next) => _next = next;
public async Task InvokeAsync(HttpContext context)
{
var sw = Stopwatch.StartNew;
await _next(context);
sw.Stop;
Console.WriteLine($"Request took {sw.ElapsedMilliseconds} ms");
}
}
欢迎各位票友补充。下一节我们来中间件。
相关推荐
- 如何为MySQL服务器和客户机启用SSL?
-
用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...
- k8s 证书问题排查_k8s dashboard 证书
-
从去年开始一些老项目上陆陆续续出现一些列的证书问题,(证书原理这里就不说了,官方文档一堆)多数刚开始的表现就是节点的kubelet服务起不来,节点状态NotReady表现日志如下failed...
- 企业级网络互通方案:云端OpenVPN+爱快路由器+Win11互联实战
-
企业级网络互通方案:OpenVPN搭建公有云+爱快路由器+Win11三地互联实战指南「安全高效」三地局域网秒变局域网实施环境说明...
- OpenV** Server/Client配置文件详解
-
Server配置详解...
- 接口基础认知:关键信息与合规前提
-
1.核心技术参数(必记)...
- S交换机通过SSH登录设备配置示例(RADIUS认证+本地认证独立)
-
说明:●本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。●通过不同的管理域来实现RADIUS认证与本地认证两种方式同时使用,两...
- SSL证书如何去除私钥密码保护_ssl证书怎么取消
-
有时候我们在生成证书的时候可以加入了密码保护。然后申请到证书安装到了web服务器。但是这样可能会带来麻烦。每次重启apache或者nginx的时候,都需要输入密码。那么SSL证书如何去除私钥密码保护。...
- SSL证书基础知识与自签名证书生成指南
-
一、证书文件类型解析...
- S交换机通过SSH登录设备配置示例(RADIUS认证)
-
说明:本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。假设已在RADIUS服务器上创建了用户名yc123,密码test#123。对...
- HTTPS是什么?加密原理和证书。SSL/TLS握手过程
-
秘钥的产生过程非对称加密...
- HTTPS TLS握手流程_进行tls握手
-
1.客户端向服务器发送`ClientHello`消息,包括支持的TLS版本、加密套件、随机数等信息。2.服务器收到`ClientHello`消息后,解析其中的信息,并根据配置选择一个加密套件。3....
- Spring Boot 单点登录(SSO)实现_spring boot 单点登录jwt
-
SpringBoot单点登录(SSO)实现全指南单点登录(SingleSign-On,SSO)是一种身份验证机制,允许用户使用一组凭证登录多个相关但独立的系统。在微服务架构和企业级系统中,SS...
- 源码分享:在pdf上加盖电子签章_pdf如何加盖电子公章
-
在pdf上加盖电子签章,并不是只是加个印章图片,。而是要使用一对密钥中的私钥对文件进行签字。为啥要用私钥呢?很简单,因为公钥是公开的,其他人才可以用公钥为你证明,这个文件是你签的。这就是我们常说的:私...
- 微信支付商户API证书到期 怎么更换
-
微信支付商户API证书到期更换是一个非常重要的操作,需要仔细按照流程进行。如果证书过期,所有通过API的支付、退款等操作都会失败,将直接影响您的业务。请按照以下详细步骤进行操作:重要前提:分清...