.NET/C# ⾯试题汇总系列:ASP.NET Core专题

1.如何在controller中注⼊service?

在config services⽅法中配置这个service。并且在controller的构造函数中,添加这个依赖注⼊。

2.谈⼀谈对DDD的理解?

DDD,领域驱动设计。就是通过领域来指导软件设计,是⼀种⼗分抽象的软件设计思想,它主要分为战略设计和战术设计。
战略⽅⾯,通过事件⻛暴进⾏领域模型的划分,划分出核⼼域,⼦域,⽀撑域,定义通⽤语⾔,划分出界限上下⽂。
在战术设计⽅⾯,ddd将架构分层,“松耦合,⾼内聚”是架构设计的整体思想。按照DDD思想,可以分为领域层,基础设施层,应⽤层,接⼝层。
接⼝层为前端⽤户提供api接⼝。基础设施层可以放⼀些第三⽅的服务,数据库连接等内容。应⽤层是对领域服务的编排,是很薄的⼀层(⽬前我⾃⼰的架构,应⽤的是cqrs,所有的相关逻辑都是放在了应⽤层,⽽领域层只是放了实体,因为暂时还不是特别理解领域层的服务和事件都应该写什么)。领域层包括实体,值对象,聚合根,领域服务,领域事件等内容。

3.ASP.NET Core ⽐ ASP.NET 更具优势的地⽅是什么?

  1. 跨平台,ASP.NET Core 可以运⾏在 Windows 、Linux 和 MAC 系统上;
  2. 对框架本安装没有依赖,所有依赖都跟程序本身在⼀起;
  3. ASP.NET Core 处理请求的效率更⾼,进⽽可以处理更多的请求;
  4. ASP.NET Core 具有更多的安装配置⽅法。

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

  1. 依赖注⼊。
  2. ⽇志系统架构。
  3. 引⼊了⼀个跨平台的⽹络服务器,kestrel。可以没有iis, apache和nginx就可以单独运⾏。
  4. 可以使⽤命令⾏创建应⽤。
  5. 使⽤AppSettings.json 来配置⼯程。
  6. 使⽤start up来注册服务。
  7. 更好的⽀持异步编程。
  8. ⽀持web socket和signal IR。
  9. 对于跨⽹站的请求的预防和保护机制。

5.ASP.NET Core Filter如何⽀持依赖注⼊?

  1. 可以通过全局注册,⽀持依赖注⼊
  2. 通过TypeFilter(typeof(Filter)) 标记在⽅法,标记在控制器
  3. 通过ServiceType(typeof(Filter))标记在⽅法,标记在控制器,必须要注册Filter这类;
    TypeFilter和ServiceType的本质是实现了⼀个IFilterFactory接⼝;

6. 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);
        }
    }

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

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

        public override void OnResultExecuted(ResultExecutedContext context)
        {
            var exception = context.Exception;
            if (exception != null)
            {
                context.ExceptionHandled = true;
                context.HttpContext.Response.WriteAsync($"错误 : {exce  ption.Message}");
            }
            base.OnResultExecuted(context);
        }
    }

使⽤⽅式有两种,
在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 CustomExceptionFilterAttribute : ExceptionFilterAttribute
    {
        public override void OnException(ExceptionContext context)
        {
            context.ExceptionHandled = true;
            context.HttpContext.Response.WriteAsync($"CustomExceptionF}");
            base.OnException(context);
        }
    }

4.使⽤ExceptionHandler.
在 startup ⾥,vs新建的项⽬会默认加上.

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

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)
            {
                //处理异常
            }
        }
    }

7、介绍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>();

8.什么是依赖注⼊?

依赖注⼊是⼀个过程,就是当⼀个类需要调⽤另⼀个类来完成某项任务的时候,在调⽤类⾥⾯不要去new被调⽤的类的对象,⽽是通过注⼊的⽅式来获取这样⼀个对象。具体的实现就是在调⽤类⾥⾯有⼀个被调⽤类的接⼝,然后通过调⽤接⼝的函数来完成任务。⽐如A调⽤B,⽽B实现了接⼝C,那么在A⾥⾯⽤C定义⼀个变量D,这个变量的实例不在A⾥⾯创建,⽽是通过A的上下⽂来获取。这样做的好处就是将类A和B分开了,他们之间靠接⼝C来联系,从⽽实现对接⼝编程。

9.依赖注⼊有哪⼏种⽅式?

setter注⼊:
就是在类A⾥⾯定义⼀个C接⼝的属性D,在A的上下⽂通过B实例化⼀个对象,然后将这个对象赋值给属性D。主要就是set 与 get
构造函数注⼊:
就是在创建A的对象的时候,通过参数将B的对象传⼊到A中。还有常⽤的注⼊⽅式就是⼯⼚模式的应⽤了,这些都可以将B的实例化放到A外⾯,从⽽让A和B没有关系。还有⼀个接⼝注⼊,就是在客户类(A)的接⼝中有⼀个服务类(B)的属性。在实例化了这个接⼝的⼦类后,对这个属性赋值,这和setter注⼊⼀样。
接⼝注⼊
相⽐构造函数注⼊和属性注⼊,接⼝注⼊显得有些复杂,使⽤也不常⻅。具体思路是先定义⼀个接⼝,包含⼀个设置依赖的⽅法。然后依赖类,继承并实现这个接⼝。

10.控制反转是什么?

控制反转(Inversion of Control,缩写为IoC),是⾯向对象编程中的⼀种设计原则,可以⽤来减低计算机代码之间的耦合度。其中最常⻅的⽅式叫做依赖注⼊(Dependency Injection,简称DI),还有⼀种⽅式叫“依赖查找”(Dependency Lookup)。
通过控制反转,对象在被创建的时候,由⼀个调控系统内所有对象的外界实体将其所依赖的对象的引⽤传递给它。也可以说,依赖被注⼊到对象中。

11.依赖注⼊有哪些著名的框架?

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

12.介绍⼀些ABP.NEXT?

ASP.NET Boilerplate是.Net平台⾮常优秀的⼀个开源Web应⽤程序框架,在国内也有⼤量的粉丝.从名称可以看出来, 这是ASP.NET Boilerplate的下⼀代框架。ABP框架创作于2013年,那时候没有.Net Core和ASP.NET Core,也没有Angular2 +。ABP发布后,它们都是从头开发的。
ASP.NET Core引⼊了许多内置解决⽅案(扩展库),⽤于依赖注⼊,⽇志记录,缓存,本地化,配置等。它们实际上独⽴于ASP.NET Core,可⽤于任何类型的应⽤程序。

13.什么是dot net core的startup class?

Startup class是dot net core应⽤的⼊⼝。所有的dot net core应⽤必须有这个class。这个类⽤来配置应⽤。这个类的调⽤是在program main函数⾥⾯进⾏配置的。类的名字可以⾃⼰定义。

14.startup class的configure⽅法有什么作⽤?

这个⽅法来定义整个应⽤如何响应HTTP请求。它有⼏个⽐较重要的参数,application builder,Hostingenvironment, logo factory, 在这⾥我们可以配置⼀些中间件⽤来处理路径,验证和session等等。

15.什么是中间件(Middleware)?

中间件是组装到应⽤程序管道中以处理请求和响应的软件。 每个组件:选择是否将请求传递给管道中的下⼀个组件。可以在调⽤管道中的下⼀个组件之前和之后执⾏⼯作。请求委托(Request delegates)⽤于构建请求管道,处理每个HTTP请求。请求委托使⽤Run,Map和Use扩展⽅法进⾏配置。单独的请求委托可以以内联匿名⽅法(称为内联中间件)指定,或者可以在可重⽤的类中定义它。这些可重⽤的类和内联匿名⽅法是中间件或中间件组件。请求流程中的每个中间件组件都负责调⽤流⽔线中的下⼀个组件,如果适当,则负责链接短路。

16.中间件的使⽤场景有哪些?

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

17.列举官⽅常⽤的中间件?

异常/错误处理 当应⽤在开发环境中运⾏时: 开发⼈员异常⻚中间件 (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)。

18.中间件的执⾏顺序?

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

19.application builder的use和run⽅法有什么区别?

这两个⽅法都在start up class的configure⽅法⾥⾯调⽤。都是⽤来向应⽤请求管道⾥⾯添加中间件的。Use⽅法可以调⽤下⼀个中间件的添加,⽽run不会。

20.dot net core 管道⾥⾯的map拓展有什么作⽤?

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

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

21.dot net core⾥⾯的路径是如何处理的?

路径处理是⽤来为进⼊的请求寻找处理函数的机制。所有的路径在函数运⾏开始时进⾏注册。
主要有两种路径处理⽅式, 常规路径处理和属性路径处理。常规路径处理就是⽤MapRoute的⽅式设定调⽤路径,属性路径处理是指在调⽤函数的上⽅设定⼀个路径属性。

22.dot net core⼯程⾥⾯有哪些常⻅的⼯程⽂件

global, launch setting,app settings,bundle config,bower, package。

23.依赖注⼊实现原理?

实现DI,核⼼在于依赖注⼊容器IContainer,该容器具有以下功能
①.(容器)保存可⽤服务的集合 // 要⽤的特定对象、特定类、接⼝服务
②.(注册)提供⼀种⽅式将各种部件与他们依赖的服务绑定到⼀起;// Add…函数或containerBuilder.Register函数,
③.(解析点)为应⽤程序提供⼀种⽅式来请求已配置的对象: 构造函数注⼊、属性注⼊.运⾏时,框架会⼀层层通过反射构造实例,最终得到完整对象

24.ASP.NET Core项⽬如何设置IP地址和端⼝号?

可以使⽤Properties⽂件夹下的launchSettings配置⽂件来配置不同的启动⽅式的时候,分别配置IP和端⼝号。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BUG呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值