2024 asp.net core面试题最新收录

今年大环境不景气,很多公司裁员,也给.net程序员找工作带来一些困扰,asp.net core面试题是为找工作的朋友准备的,本来这坨土地上.net 程序员工作岗位就不多。

今年大环境不景气,很多公司裁员,也给.net程序员找工作带来一些困扰,asp.net core面试题是为找工作的朋友准备的,本来这坨土地上.net 程序员工作岗位就不多,不过无所谓,工作该找的还是得找,面试该准备的还是得准备。话说回来,如果程序员能够多学一门外语技能,可以解锁更好的工作岗位哟。

asp.net core面试题最新收录
asp.net core面试题最新收录

asp.net core面试题

1. 如何在 controller 中注入 service?

在 config services 方法中配置这个 service。

在 controller 的构造函数中,添加这个依赖注入。

//在 config services 方法中配置这个 service。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService>((container) =>
    {
        var logger = container.GetRequiredService<ILogger<MyService>>();
        return new MyService
        {
            Logger = logger
        };
    });
}

//在 controller 的构造函数中,添加这个依赖注入。
public class AuditOperationController : AdminApiController
{
    private readonly IMyService _myService;

    public AuditOperationController(IMyService myService)
    {
        _myService = myService;
    }
}

2. ASP.NET Core 比 ASP.NET 更具优势的地方是什么?

更具优势的地方是跨平台,ASP.NET Core 可以运行在 Windows 、Linux 和 MAC 系统上,对框架本安装没有依赖,所有依赖都跟程序本身在一起;ASP.NET Core 处理请求的效率更高,进而可以处理更多的请求,ASP.NET Core 具有更多的安装配置方法。

3. asp.net core 主要的特性有哪些?

  1. 依赖注入。
  2. 日志系统架构。
  3. 引入了一个跨平台的网络服务器,kestrel。
  4. 可以没有 iis, apache 和 nginx 就可以单独运行。
  5. 可以使用命令行创建应用。
  6. 使用 AppSettings.json 来配置工程。
  7. 使用 startup 来注册服务。
  8. 更好的支持异步编程。
  9. 支持 websocket 和 signaIR。
  10. 对于跨网站的请求的预防和保护机制

4. ASP.NET Core Filter 如何支持依赖注入?

可以通过全局注册,支持依赖注入。通过TypeFilter(typeof(Filter)) 标记在方法,标记在控制器。通过ServiceType(typeof(Filter))标记在方法,标记在控制器,必须要注册Filter这类;TypeFilter和ServiceType的本质是实现了一个IFilterFactory接口。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<TestActionFilterAttribute>();
    services.AddControllersWithViews(options =>
    {
        options.Filters.Add<TestActionFilterAttribute>();
    });
}

[TypeFilter(typeof(Filter))]
public IActionResult Index()
{
    return View();
}

[ServiceFilter(typeof(Filter))]
public IActionResult Index()
{
    return View();
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<TestActionFilterAttribute>();
    services.AddControllersWithViews();
}

5. ASP.NET Core 中有哪些异常处理的方案?

1).继承 Controller,重写 OnActionExecuted

默认都会继承一个 Controller 类,重写 OnActionExecuted,添加上异常处理即可 。 一 般 情 况 下 我 们 会 新 建 一 个 BaseController, 让 所 有 Controller 继 承BaseController。代码如下:

public class BaseController : Controller
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        var exception = context.Exception;
        if (exception != null)
        {
            context.ExceptionHandled = true;
            context.Result = new ContentResult
            {
                Content = $"BaseController错误:{exception.Message}",
            };
        }
        base.OnActionExecuted(context);
    }
}

asp.net core面试题最新收录

2).使用 ActionFilterAttribute

ActionFilterAttribute 是一个特性,本身实现了 IActionFilter 及 IResultFilter , 所以不管是 action 里抛错,还是 view 里抛错,理论上都可以捕获。我们新建一个 ExceptionActionFilterAttribute, 重写OnActionExecuted 及OnResultExecuted,添加上异常处理,完整代码如下

/// <summary>
/// 操作审计拦截器,负责发起并记录功能的操作日志
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class AuditOperationAttribute : ActionFilterAttribute
{
    /// <inheritdoc />
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        IServiceProvider provider = context.HttpContext.RequestServices;
        IFunction function = context.GetExecuteFunction();
        if (function == null)
        {
            return;
        }
        ScopedDictionary dict = provider.GetRequiredService<ScopedDictionary>();
        // 数据权限有效角色,即有当前功能权限的角色
        IFunctionAuthorization functionAuthorization = provider.GetRequiredService<IFunctionAuthorization>();
        string[] roleName = functionAuthorization.GetOkRoles(function, context.HttpContext.User);
        dict.DataAuthValidRoleNames = roleName;

        if (!function.AuditOperationEnabled)
        {
            return;
        }
        AuditOperationEntry operation = new AuditOperationEntry
        {
            FunctionName = function.Name,
            Ip = context.HttpContext.GetClientIp(),
            UserAgent = context.HttpContext.Request.Headers["User-Agent"].FirstOrDefault(),
            CreatedTime = DateTime.Now
        };
        if (context.HttpContext.User.Identity.IsAuthenticated && context.HttpContext.User.Identity is ClaimsIdentity identity)
        {
            operation.UserId = identity.GetUserId();
            operation.UserName = identity.GetUserName();
            operation.NickName = identity.GetNickName();
        }

        dict.AuditOperation = operation;
    }

    /// <inheritdoc />
    public override void OnResultExecuted(ResultExecutedContext context)
    {
        IServiceProvider provider = context.HttpContext.RequestServices;
        ScopedDictionary dict = provider.GetRequiredService<ScopedDictionary>();
        if (dict.AuditOperation?.FunctionName == null)
        {
            return;
        }
        dict.AuditOperation.EndedTime = DateTime.Now;
        IUnitOfWork unitOfWork = provider.GetService<IUnitOfWork>();
        unitOfWork?.Dispose();

        //移除当前功能,使保存审计信息的时候不再获取记录变更,审计信息不需要再审计
        dict.Function = null;
        provider.BeginUnitOfWorkTransaction(scopeProvider =>
        {
            IAuditStore store = scopeProvider.GetService<IAuditStore>();
            store?.Save(dict.AuditOperation);
        });
    }

}

asp.net core面试题最新收录

使用方式有两种,在 controller 里打上 [TypeFilter(typeof(ExceptionActionFilter)] 标签;在 Startup 里以 filter 方式全局注。

services.AddControllersWithViews(options => {
    options.Filters.Add<ExceptionActionFilterAttribute>();
});

3).使用 IExceptionFilter

我们知道, Asp.Net Core 提供了 5 类 filter, IExceptionFilter 是其中之一,顾名思义,这就是用来处理异常的。Asp.net Core 中 ExceptionFilterAttribute 已经实现了 IExceptionFilter,所以我们只需继承ExceptionFilterAttribute,重写其中 方 法 即 可 。 同 样 新 建 CustomExceptionFilterAttribute 继 承
ExceptionFilterAttribute,重写 OnException ,添加异常处理,完整代码如下:

public class ExceptionHandle : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        var ex = context.Exception;
        var controllername = context.RouteData.Values["controller"].ToString();
        var actionname = context.RouteData.Values["action"].ToString();
         
        if (context.ExceptionHandled == false)
        {
        context.Result= ReturnResult(resultType.ContentResult,ex);
        }
        context.ExceptionHandled = true; //异常已处理了
    }
}

4).使用 ExceptionHandler.

在 startup 里,vs 新建的项目会默认加上

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Home/Error");
}

//ConfigureServices方法
public void ConfigureServices(IServiceCollection services)
{
    //其它
    services.AddScoped<ExceptionHandle>();
}

//控制器里面的某个Action使用自定义的ExceptionHandle处理异常
[ServiceFilter(typeof(ExceptionHandle))]
public IActionResult Index(DateTime dt, long sjc)
{
    var chushu = 0;
    var i = 1 / chushu;
    return View()
}

5).自定义 Middleare 处理

通过 middleware 全局处理。

public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate next;
    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        this.next = next;
    }
    public async Task Invoke(HttpContext context)
    {
        try
        {
            await next(context);
        }
        catch (System.Exception ex)
        {
            //处理异常       
        }

    }
}

asp.net core面试题最新收录

6. 介绍 ASP.NET Core 中服务的生命周期?

ASP.NET Core 支持依赖注入软件设计模式,它允许在不同的组件中注入我们的服务,并且控制服务的初始化。有些服务可以在短时间内初始化,并且只能在某个特别的组件,以及请求中才能用到;而还有一些服务,仅仅只用初始化一次,就可以在整个应用程序中使用。

Singleton –单例模式:

只有一个服务的实例被创建,这个实例,存储在内存中,可以在整个应用程序中使用。我们可以对一些初始化代价比较大的服务,使用 Singleton 模式。在代码中可以这样:

services.AddSingleton<IProductService, ProductService>();

Scoped –作用域

这种模式下,将会为每一个请求,都创建一个服务的实例。所有同一个请求中的 中间件、MVC 控器,等等,都会得到一个相同的服务实例。Entity Framework Context 就是一个 Scoped 服务最好的参考例子。我们可以通过使用 AddScoped 方法来使用 Scoped 模式:

services.AddScoped<IProductService, ProductService>();

Transient –短暂的、瞬变的

Transient 模式下,服务每次被请求的时候,都会创建一个服务实例,这种模式特 别适合轻量级、无状态的服务。我们可以使用 AddTransient 方法,来注入服务:

services.AddTransient<IProductService,ProductService>();

7. 什么是依赖注入?

依赖注入是一个过程,就是当一个类需要调用另一个类来完成某项任务的时候, 在调用类里面不要去 new 被调用的类的对象,而是通过注入的方式来获取这样一 个对象。具体的实现就是在调用类里面有一个被调用类的接口,然后通过调用接 口的函数来完成任务。

比如 A 调用 B,而 B 实现了接口 C,那么在 A 里面用 C 定 义一个变量 D,这个变量的实例不在 A 里面创建,而是通过 A 的上下文来获取。 这样做的好处就是将类 A 和 B 分开了,他们之间靠接口 C 来联系,从而实现对接 口编程。

8. 依赖注入有哪几种方式?

setter 注入

就是在类 A 里面定义一个 C 接口的属性 D,在 A 的上下文通过 B 实例化一个对象,然后将这个对象赋值给属性 D。主要就是 set 与 get。

构造函数注入

就是在创建 A 的对象的时候,通过参数将 B 的对象传入到 A 中。还有常用的注入方式就是工厂模式的应用了,这些都可以将 B 的实例化放到 A 外面,从而让 A 和 B 没有关系。还有一个接口注入,就是在客户类(A)的接口中有一个服务类(B)的属性。在实例化了这个接口的子类后,对这个属性赋值,这和setter 注入一样。

接口注入

相比构造函数注入和属性注入,接口注入显得有些复杂,使用也不常见。具体思路是先定义一个接口,包含一个设置依赖的方法。然后依赖类,继承并实现这个接口。

9. 控制反转是什么?

控制反转(Inversion of Control,缩写为 IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称 DI),还有一种方式叫“依赖查找”(Dependency Lookup)。

通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

10. 依赖注入有哪些著名的框架?

Unity、autofac、http://spring.net、MEF、Injection、Asp.Net Core的 ServiceCollection。

11. 什么是 dotnet core 的 startup class?

Startup class 是 dot net core 应用的入口。所有的 dot net core 应用必须有这个 class。这个类用来配置应用。这个类的调用是在 program main 函数里面进行配置的。类的名字可以自己定义。

12. startup class 的 configure 方法有什么作用?

这个方法来定义整个应用如何响应 HTTP 请求。它有几个比较重要的参数,application builder,Hosting environment, logo factory, 在这里我们可以配置一些中间件用来处理路径,验证和 session 等等。

13. 什么是.NET Core 中间件(Middleware)?

中间件是组装到应用程序管道中以处理请求和响应的软件。每个组件:选择是否将请求传递给管道中的下一个组件。可以在调用管道中的下一个组件之前和之后执行工作。请求委托(Request delegates)用于构建请求管道,处理每个 HTTP 请求。

请求委托使用 Run,Map 和 Use 扩展方法进行配置。单独的请求委托可以以内联匿名方法(称为内联中间件)指定,或者可以在可重用的类中定义它。这些可重用的类和内联匿名方法是中间件或中间件组件。请求流程中的每个中间件组件都负责调用流水线中的下一个组件,如果适当,则负责链接短路。

14. ASP.NET Core 中间件的使用场景有哪些?

份验证,Session 存储,日志记录等。其实我们的 Asp.net core 项目中本身已经包含了很多个中间件。比如 身份认证中间件 UseAuthorization()等系列。

15. 列举官方常用的中间件?

异 常 / 错 误 处 理 当 应 用 在 开 发 环 境 中 运 行 时 : 开 发 人 员 异 常 页 中 间 件(UseDeveloperExceptionPage) 报告应用运行时错误。数据库错误页中间件报告 数 据 库 运 行 时 错 误 。 当 应 用 在 生 产 环 境 中 运 行 时 : 异 常 处 理 程 序 中 间 件(UseExceptionHandler) 捕获以下中间件中引发的异常。HTTP 严格传输安全协议 (HSTS) 中间件 (UseHsts) 添加 Strict-Transport-Security 标头。

HTTPS 重 定 向 中 间 件 (UseHttpsRedirection) 将 HTTP 请 求 重 定 向 到HTTPS。静态文件中间件 (UseStaticFiles) 返回静态文件,并简化进一步请求处理。Cookie 策略中间件 (UseCookiePolicy) 使应用符合欧盟一般数据保护条例(GDPR) 规定。

用于路由请求的路由中间件 (UseRouting)

身份验证中间件 (UseAuthentication) 尝试对用户进行身份验证,然后才会允许用户访问安全资源。用于授权用户访问安全资源的授权中间件 (UseAuthorization)。

会话中间件 (UseSession) 建立和维护会话状态。如果应用使用会话状态,请在Cookie 策略中间件之后和 MVC 中间件之前调用会话中间件。

用 于 将 Razor Pages 终 结 点 添 加 到 请 求 管 道 的 终 结 点 路 由 中 间 件 ( 带 有MapRazorPages 的 UseEndpoints)。

16.ASP.NET Core 中间件的执行顺序?

异常/错误处理
HTTP 严格传输安全协议
HTTPS 重定向
静态文件服务器
Cookie 策略实施
路由
身份验证
会话MVC

asp.net core面试题最新收录
2024 asp.net core面试题最新收录 4

asp.net core面试题最新收录

17. application builder 的 use 和 run 方法有什么区别?

这两个方法都在 start up class 的 configure 方法里面调用。都是用来向应用请求管道里面添加中间件的。Use 方法可以调用下一个中间件的添加,而 run 不会。

Use:通过Use的方式注册中间件,可以控制是否将请求传递到下一个中间件;

Run:通过Run的方式注册中间件,一般用于断路或请求管道末尾,即不会将请求传递下去;

这两个方法都在startup class的configure方法里面调用。都是用来向应用请求管道里面添加中间件的。

public void Configure(IApplicationBuilder app, IHostingEnvironment env){
  //可以看到通过匿名函数实现的中间件是内嵌在启动类文件中的,因此通常也叫做内联中间件。
   app.Use(async (context, next) =>{
        await context.Response.WriteAsync("One Holle Word 1!\r\n");
        await next();//传递到下一个中间件,而不是先执行下面的
        await context.Response.WriteAsync("One Holle Word 2!\r\n");
   });
   app.Run(async (context) =>{
         await context.Response.WriteAsync("Two Holle Word 1!\r\n");
         await context.Response.WriteAsync("Two Holle Word 2!\r\n");
   });
}

执行结果,注意看执行顺序。

asp.net core面试题最新收录

asp.net core面试题最新收录

18. dotnet core 管道里面的 map 拓展有什么作用?

可以针对不同的路径添加不同的中间件。

public void Configure(IApplicationBuilder app)
{
    app.Map("/path1", Middleware1);
    app.Map("/path2", Middleware2);
}

中间件是组装到应用程序管道中以处理请求和响应的软件组件。每个组件都选择是否将请求传递给管道中的下一个组件,并可以在管道中调用下一个组件之前和之后执行某些操作。映射扩展名用作分支管道的约定。Map扩展方法用于根据请求的路径来匹配请求委托。Map仅接受路径和配置单独的中间件管道的函数。

在下面的示例中,任何带有/ maptest基本路径的请求都将由HandleMapTest方法中配置的管道处理。

private static void HandleMapTest(IApplicationBuilder app)
{
    app.Run(async context => {
        await context.Response.WriteAsync("Map Test Successful");
    });
}
public void ConfigureMapping(IApplicationBuilder app)
{
    app.Map("/maptest", HandleMapTest);
}

除了基于路径的映射外,MapWhen方法还支持基于谓词的中间件分支,从而允许以非常灵活的方式构造单独的管道。类型Func <HttpContext,bool>的任何谓词均可用于将请求映射到管道的新分支。

private static void HandleBranch(IApplicationBuilder app)
{
    app.Run(async context => {
        await context.Response.WriteAsync("使用分支。");
    });
}
public void ConfigureMapWhen(IApplicationBuilder app)
{
    app.MapWhen(context => {
        return context.Request.Query.ContainsKey("branch");
    }, HandleBranch);
    app.Run(async context => {
        await context.Response.WriteAsync("Hello from " + _environment);
    });
}

asp.net core面试题最新收录

映射也可以嵌套。

app.Map("/jhrs", level1App => {
   level1App.Map("/znlive", level2AApp => {
      // "/jhrs/znlive"
      //...------
   });
   level1App.Map("/by3", level2BApp => {
      // "/jhrs/by3"
      //...------
   });
});

asp.net core面试题最新收录

19. dotnet core 里面的路径是如何处理的?

路径处理是用来为进入的请求寻找处理函数的机制。所有的路径在函数运行开始时进行注册。

主要有两种路径处理方式, 常规路径处理和属性路径处理。常规路径处理就是用MapRoute 的方式设定调用路径,属性路径处理是指在调用函数的上方设定一个路径属性。

20. dotnet core 工程里面有哪些常见的工程文件?

global, launch setting,appsettings, bundle config, bower, package。

21. ASP.NET Core 项目如何设置 IP 地址和端口号?

可以使用 Properties 文件夹下的 launchSettings 配置文件来配置不同的启动方
式的时候,分别配置 IP 和端口号。

加入电报群

【江湖人士】(jhrs.com)原创文章,作者:江小编,如若转载,请注明出处:https://jhrs.com/2023/47080.html

扫码加入电报群,让你获得国外网赚一手信息。

文章标题:2024 asp.net core面试题最新收录

(0)
江小编的头像江小编
上一篇 2023-10-20 20:51
下一篇 2023-10-22 22:44

热门推荐

Leave a Reply

Sending

国外老牌便宜域名服务商Namecheap注册com域名大优惠,抢到就赚到,优惠码:NEWCOM698
$5.98/年
直达官网