admin管理员组文章数量:1438515
一看就想走的.NET面试题
群友提供的某公司的.NET面试题,他们说看到这种试题就想走。小编把面试题给大家贡献出来,供大家参考。
先列出试题,大家尝试做一做。
面试题
1、startup 类是什么?在哪里调用 startup 类?configservice、configure 方法是什么?
2、描述一下依赖注入后的服务生命周期?
3、说说脚本在请求 Web CoreApi 的时候,为什么会发生跨域问题?如何解决?
4、说说你了解到的鉴权授权技术。
参考答案:
1、Startup 类是什么?在哪里调用 Startup 类?ConfigureServices
和 Configure
方法是什么?
Startup 类的作用
Startup
类是 ASP.NET Core 应用程序的入口之一,负责配置应用程序的服务和请求处理管道。
它在应用启动时由 Web 主机(Web Host)或泛型主机(Generic Host) 进行调用。
Startup 类的调用
ASP.NET Core 在 Program.cs
里 创建和配置 WebHost 时,会调用 Startup
类的构造函数,然后执行其 ConfigureServices
和 Configure
方法。例如:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
在这个过程中,Startup
类的 ConfigureServices
和 Configure
方法会被调用。
ConfigureServices
方法
作用:注册和配置应用程序所需的服务(依赖注入 DI)。
在 ConfigureServices
方法中,我们可以向 IoC 容器(依赖注入容器)中添加 服务,例如:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<ApplicationDbContext>();
services.AddScoped<IMyService, MyService>();
}
services
参数是 IServiceCollection 类型,ASP.NET Core 通过它管理应用的依赖关系。
Configure
方法
作用:配置 HTTP 请求处理管道(中间件)。
在 Configure
方法中,我们可以定义 中间件(Middleware) 的执行顺序,例如:
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:
services.AddCors(options =>
{
options.AddPolicy("AllowAll",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
});
在 Configure
方法中应用 CORS:
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 是否包含特定的值,适用于更细粒度的权限控制。
本文标签: 一看就想走的NET面试题
版权声明:本文标题:一看就想走的.NET面试题 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1747583316a2716046.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论