百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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)。这每一种方法各有其...

OpenVPN客户端配置_openvpn客户端配置文件解析

...

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的支付、退款等操作都会失败,将直接影响您的业务。请按照以下详细步骤进行操作:重要前提:分清...