admin管理员组

文章数量:1438515

一看就想走的.NET面试题

群友提供的某公司的.NET面试题,他们说看到这种试题就想走。小编把面试题给大家贡献出来,供大家参考。

先列出试题,大家尝试做一做。

面试题

1、startup 类是什么?在哪里调用 startup 类?configservice、configure 方法是什么?

2、描述一下依赖注入后的服务生命周期?

3、说说脚本在请求 Web CoreApi 的时候,为什么会发生跨域问题?如何解决?

4、说说你了解到的鉴权授权技术。

参考答案:

1、Startup 类是什么?在哪里调用 Startup 类?ConfigureServicesConfigure 方法是什么?

Startup 类的作用

Startup 类是 ASP.NET Core 应用程序的入口之一,负责配置应用程序的服务和请求处理管道。 它在应用启动时由 Web 主机(Web Host)或泛型主机(Generic Host) 进行调用。

Startup 类的调用

ASP.NET Core 在 Program.cs创建和配置 WebHost 时,会调用 Startup 类的构造函数,然后执行其 ConfigureServicesConfigure 方法。例如:

代码语言:javascript代码运行次数:0运行复制
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

在这个过程中,Startup 类的 ConfigureServicesConfigure 方法会被调用。

ConfigureServices 方法

作用:注册和配置应用程序所需的服务(依赖注入 DI)。

ConfigureServices 方法中,我们可以向 IoC 容器(依赖注入容器)中添加 服务,例如:

代码语言:javascript代码运行次数:0运行复制
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddDbContext<ApplicationDbContext>();
    services.AddScoped<IMyService, MyService>();
}

services 参数是 IServiceCollection 类型,ASP.NET Core 通过它管理应用的依赖关系。

Configure 方法

作用:配置 HTTP 请求处理管道(中间件)

Configure 方法中,我们可以定义 中间件(Middleware) 的执行顺序,例如:

代码语言:javascript代码运行次数:0运行复制
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

这里 UseRouting()UseAuthorization()UseEndpoints() 就是 中间件,它们决定了请求如何被处理。


2、描述一下依赖注入后的服务生命周期?

ASP.NET Core 提供 三种依赖注入(DI)生命周期

Transient(瞬时)

  • 每次请求都会创建一个新的实例。
  • 适用于 无状态、轻量级的服务
  • 例子:services.AddTransient<IMyService, MyService>();

Scoped(作用域)

  • 每个 HTTP 请求 共享同一个实例。
  • 适用于 数据库上下文(DbContext)或业务逻辑类
  • 例子:services.AddScoped<IMyService, MyService>();
  • 注意:Scoped 作用域仅在 Web 请求范围内有效,在单独线程或后台任务中不会自动生效!

Singleton(单例)

  • 整个应用程序生命周期内只有一个实例
  • 适用于 全局共享资源,如缓存、日志、配置管理
  • 例子:services.AddSingleton<IMyService, MyService>();
  • 注意:单例服务要避免使用有状态的对象,否则可能会引发线程安全问题!

3、脚本请求 Web API 时为什么会发生跨域(CORS)问题?如何解决?

什么是跨域问题?
  • 同源策略(Same-Origin Policy) 限制了浏览器只能访问 相同协议、相同域名、相同端口 的资源。
  • 如果前端 (http://localhost:3000) 访问后端 **(http://localhost:5000/api/data)**,就会触发 跨域请求,浏览器默认会 阻止 这样的请求。
如何解决跨域问题?

使用 CORS(跨域资源共享)ConfigureServices 方法中,启用 CORS:

代码语言:javascript代码运行次数:0运行复制
services.AddCors(options =>
{
    options.AddPolicy("AllowAll",
        builder => builder.AllowAnyOrigin()
                          .AllowAnyMethod()
                          .AllowAnyHeader());
});

Configure 方法中应用 CORS:

代码语言:javascript代码运行次数:0运行复制
app.UseCors("AllowAll");

使用 Response Header 允许跨域服务器响应时添加:

代码语言:javascript代码运行次数:0运行复制
Response.Headers.Add("Access-Control-Allow-Origin", "*");

使用代理(Proxy)转发请求

  • 让前端通过 代理服务器(如 Nginx 或 Webpack DevServer)转发 API 请求,从而避免跨域。

JSONP(仅支持 GET 请求)

  • 通过 <script> 标签发送 JSONP 请求,但现代 API 通常不推荐使用 JSONP

4、说说你了解到的鉴权授权技术

在 .NET Core 中,认证(Authentication)授权(Authorization) 是 Web 安全的核心部分。

1. 鉴权方式(Authentication)

鉴权是 确认用户身份 的过程,常见方法包括:

JWT(JSON Web Token)

  • 无状态 认证方式,适用于 前后端分离 场景。
  • 服务器生成一个加密的 Token,前端请求时带上 Authorization: Bearer <token> 头部。
  • 服务器端用 JwtBearer 进行验证:services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("YourSecretKey")) }; });

Cookie 认证

  • 适用于 传统的服务器渲染应用(如 MVC)
  • 用户登录后,服务器在浏览器设置 Set-Cookie,后续请求自动带上 Cookie

OAuth2 + OpenID Connect

  • 用于第三方登录(如 GitHub、Google、WeChat)。
  • ASP.NET Core 提供 Microsoft.AspNetCore.Authentication.OpenIdConnect 进行集成。
2. 授权方式(Authorization)

授权是 确认用户是否有权限访问资源 的过程,常见方式包括:

基于角色的授权(Role-based Authorization)

代码语言:javascript代码运行次数:0运行复制
[Authorize(Roles = "Admin")]
public IActionResult AdminOnly()
{
    return Ok("只有管理员可以访问");
}

基于策略的授权(Policy-based Authorization)

代码语言:javascript代码运行次数:0运行复制
services.AddAuthorization(options =>
{
    options.AddPolicy("AgeOver18", policy =>
        policy.RequireAssertion(context =>
            context.User.HasClaim(c => c.Type == "Age" && int.Parse(c.Value) >= 18)));
});

控制器中应用:

代码语言:javascript代码运行次数:0运行复制
[Authorize(Policy = "AgeOver18")]
public IActionResult AdultOnly()
{
    return Ok("成年人才能访问");
}

基于声明的授权(Claims-based Authorization)

  • 检查用户的 Claims 是否包含特定的值,适用于更细粒度的权限控制。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-21,如有侵权请联系 cloudcommunity@tencent 删除生命周期依赖注入服务跨域配置

本文标签: 一看就想走的NET面试题