前端妹子想接触netcore开发,于是我…

内容纲要

hi,我是桑小榆,随之近几年NetCore的兴起,相关的开源社区异常的活动,毕竟它的出现弥补了以前不少的缺陷,并且它的趋势其实也是符合未来发展的,从 NET6发布后宣称大一统就已经体现了,其可玩性也是非常强的。

咱不说语言技术之间的孰强孰弱,那都是不成熟的较量,大佬都是玩转技术于股掌之间的,比如龙芯团队就是撸底层源码直接实现移植的......

话不多说,咱通过面试问答的形式来了解netcore。

NetCore 基础知识

什么是ASP.NET Core?

首先ASP.NET Core可以说是ASP.NET的升级版本。

它遵循了.NET的标准架构,是一个基于.NETCore的Web开发框架,可以运行于多个操作系统上。它更快,更容易配置,更加模块化,可扩展性更强。

如何在ASP.NETCore中激活Session功能?

先Nuget包添加Microsoft.AspNetCore.Session包。

修改Startup.cs文件的ConfigureServices方法,增加Session服务注册:services.AddSession();

修改Startup.cs文件的的Configure方法,请求管道中启用Session:app.UseSession();

Applicationbuilder的Use和Run方法有什么区别?

两个方法都在startup类的configure方法里面调用。

都是用来向应用请求管道里面添加中间件的。

Use方法可以调用下一个中间件的添加,而run不会,run是终结式的;

什么是ASP.NETCore的startup类?

startup类是ASP.NET Core应用的入口。所有的ASP.NETCore应用必须有这个类,用来配置应用。这个类的调用是在Program main函数里面进行配置的,类的名字可以自己定义。

startup类的configservice方法有什么作用?

在这个方法里我们可以添加一些service进入依赖注入容器。

startup类的configure方法有什么作用?

这个方法来定义整个应用如何响应HTTP请求。

它有几个比较重要的参数,Application Builder,Hosting Environment, LogFactory, 在这里我们可以配置一些中间件用来处理路径,验证和session等等。 

ASP.NET Core管道里面的map拓展有什么作用?

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

ASP.NET Core里面的路径是如何处理的?

路径处理是用来为进入的请求寻找处理函数的机制。所有的路径在函数运行开始时进行注册。主要有两种路径处理方式,常规路径处理和属性路径处理。

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

ASP.NETCore工程里面有多少个工程文件?

launchsetting,appsettings,Program,Startup

什么是ASP.NETCore里面的taghelper

TagHelper用来在服务器端使用Razor视图引擎创建html元素的。

说说.NET5中_ViewImports文件的作用。

在.NET5中可以支持组件化编程,定义的各种组件,在项目中使用的时候,需要在_ViewImports文件中引入进来。

什么是Razor页面?

是ASP.NETCore中支持ASP网页表格的一种开发模型。@page作为页面的起始标志。

说说.NET5中__ViewStart文件的作用

在控制器在返回视图的时候,开始替换视图引擎的时候,从_ViewStart.cshtml开始,来初始化展示的视图界面;

如何在Razor页面中实现数据模型绑定?

使用bindproperty属性。

什么是metapackages?

MetaPackages是指包含所有ASPDotNetCode依赖的一个包。叫做Microsoft.AspNetCore。

ASP.NETCore项目中,wwwroot文件夹内包含什么内容?

包含了css、js、js库、字体文件

NetCore 服务组件与配置

什么是中间件?

中间件在这里是指注入到应用中处理请求和响应的组件。是通过多个委托来嵌套形成的一个俄罗斯套娃。

ASP.NETCore中AOP的支持有哪些?


//通过Filter来支持;分别有以下五种
IResourceFilter
AuthorizeFilter
ActionFilter
ExceptionFilter
ResultFilter
Filter 也被称为拦截器! 

ASP.NETCoreFilter的注册方式有哪些?


方法注册:只对方法生效

控制器注册:对控制器中的所有方法生效

全局注册:对整个项目生效;

ASP.NETCoreFilter如何支持依赖注入?

可以通过全局注册,支持依赖注入。

通过TypeFilter(typeof(Filter))标记在方法,标记在控制器

通过ServiceType(typeof(Filter))标记在方法,标记在控制器,必须要注册Filter这类。

TypeFilter和ServiceType的本质是实现了一个IFilterFactory接口。

如何在Controller中注入service?

configservices方法中配置这个service。在controller的构造函数中,添加这个依赖注入。

ASP.NETCore如何和读取配置文件中的内容?

可以有两种方式,可以通过IConfiguration接口来读取;

也可以定义根据配置文件结构一致的实体对象,来绑定到对象中去。

//第一种,将appsettings等内容结构映射到实体
public void ConfigureServices(IServiceCollection services)
{
      //other service
      //1.将appsettings的键值映射到对应的类。
      services.Configure<ServiceUrlOption>(Configuration.GetSection("Serviceurl"));
}
        
//使用如下
private readonly ServiceUrlOption _urlOptions;
public QRCodeRepository(IOptions<ServiceUrlOption> urlOptions)
{
     _urlOptions = urlOptions.Value;
}
//第二种,IConfiguration接口来读取
public IConfiguration Configuration { get; }
//如下 Configuration.GetSection("Serviceurl")["rewardspointurl"] 对应appsettings相应的节点
services.AddHttpClient("rewardspoint", (e) =>
     {
        e.BaseAddress = new Uri(Configuration.GetSection("Serviceurl")["rewardspointurl"]);
        e.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
     });

ASP.NETCore中如何读取静态文件?

可以通过中间件UseStaticFiles来配置读取静态文件;

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

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

ASP.NETCore如何支持Log4Net扩展?

就是一个日志组件的集成使用,大概分为以下步骤:

1.nuget引入log4net程序集;Microsoft.Extensions.Logging.Log4Net.AspNetCore程序集合

2.增加配置文件,配置文件内容如下

public void ConfigureContainer(ContainerBuilder builder)
{
}
使用了Autofac以后,在IServiceCollection中注入的服务,也能生效;
因为Autofac是先接受了所有的 来自于IServiceCollection的服务映射后,
再去读取ConfigureContainer方法中配置的映射;

3.使用Log4net配置

4.就可以支持注入了,可以在控制器中使用了

Net Core 架构优势

ASP.NET Core有哪些好的功能?


第一是依赖注入。

第二是完整的日志系统架构。

第三是引入了一个跨平台的网络服务器,kestrel。可以没有iis,apache和nginx就可以单独运行。

第四是可以使用命令行创建应用。

第五是使用appsettings来配置工程。

第六是使用startup来注册服务。

第七是更好的支持异步编程。

第八是支持websocket和signalIR。

第九是对于跨网站的请求的预防和保护机制。

ASP.NETCore跟ASP.NET比较有哪些更好的地方?

第一是跨平台,它可以运行在三大操作系统上面,windows,Linux和MAC。

第二是对架构本身安装没有依赖,因为所有的依赖都跟程序本身在一起。

第三是ASP.NETCore处理请求的效率更高,能够处理更多的请求。

第四是ASP.NETCore有更多的安装配置方法。

ASP.NETCore应用能够跟ASP.NET4.x架构一起工作吗?

可以。ASP.NETCore应用可以跟标准的dot net库一起工作。

谈谈对ASP.NETCorekestrel的理解。

Kestrel是一个跨平台的适用于ASP.NETCore的Web服务器。

Kestrel是Web服务器,默认包括在ASP.NETCore项目模板中。

Kestrel支持以下方案:

支持HTTPS

用于启用WebSocket的不透明升级

用于获得Nginx高性能的Unix套接字

HTTP/2(除 macOS 以外)
macOS的未来版本将支持 HTTP/2。

.NET Core支持的所有平台和版本均支持Kestrel。

Net Core 容器与生命周期

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

在ASP.NETCore中,我们不需要关心如何释放这些服务,因为系统会帮我们释放掉。有三种服务的生命周期。

AddSingleton:单实例服务,通过AddSingleton方法来添加。在注册时即创建服务,在随后的请求中都使用这一个服务。

AddTransient: 瞬时服务,通过AddTransient方法来添加。是一种轻量级的服务,用于无状态服务的操作。

AddScoped:作用域服务,一个新的请求会创建一个服务实例。使用AddScoped方法来添加。

说说ASP.NETCore内置容器的特点;

ASP.NETCore内置容器IServiceCollection,只支持构造函数注入。

支持三种声明周期:单例、瞬时、Scoped三种声明周期管理。

谈谈对Autofac的理解;

Autofac是一个IOC容器,支持三种类型的DI依赖注入,配置文件配置映射关系,支持AOP扩展定制。

在ASP.NETCore的使用步骤如下:

1.Nuget引入Autofac程序集

2.在Program类中的CreateHostBuilder方法中,通过.UseServiceProviderFactory(newAutofacServiceProviderFactory())替换容器工厂,把容器替换到框架中;

3.在Startup中增加ConfigureContainer方法,用来配置映射关系

4.就可以在控制器中配置构造函数注入了

Net Core WebAPI

说说脚本启动ASP.NETCoreWeb项目

介绍两种方式:

第一种:定位到Web项目的编译地址下,就是bin文件夹下的.NET5文件夹,然后在当前文件夹下打开命令提示窗口;dotnetdll文件---urls=http://ip地址:端口号回车即可;

第二种:定位到Web项目的根目录下,然后在当前文件夹下打开命令提示窗口;dotnetrun---urls=http://ip地址:端口号回车即可;推荐第二种,第二种方式,在启动的时候,会自动编译项目,然后启动dll文件;

说说CoreWebApi的Swagger

Swagger是一个Api说明文档,支持Api测试;现在CoreWebApi开发使用swagger量较高的;

在.NET5中已经内置了CoreWebApi;配置流程如下:

1.Nuget引入程序集:Swashbuckle.AspNetCore.SwaggerGen

2.配置服务:

public void ConfigureServices(IServiceCollection services) 
   {
       services.AddControllers();
       services.AddSwaggerGen(s =>{
       s.SwaggerDoc("v2", new OpenApiInfo 
       {
           Title = "SangYu Studio",
           Version = "v2"
        });    
        });
    }

3.配置使用中间件

public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 
    {
         app.UseSwagger();
         app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "SangYu Studio v2"));
    }

说说CoreWebApi特性路由。

在CoreWebApi中,每一个Api必须指定特性路由,即在Api或者控制器上标记特性Route("api/[Controller]/Api");访问Api,就按照这个格式访问;

说说RESTful是什么。

在传统的服务中,比方说WebService,WCF,Remouting,都是通过调用方法来做到一个进程去调用另外一个进程的服务。

在CoreWebApi中是把要调用的服务资源化,比方说有图书资源,Books,学生资源Studentlist,每一个资源对应一个控制器,然后对外提供增删改查等操作;对外提供统一的Uri,可以对资源Books,资源Studentlist做增删改查的操作;访问的是资源,可以根据不同的额访问方式,做不同的事儿;

说说脚本在请求WebCoreApi的时候,为什么会发生跨域问题?

跨域问题: 本质是浏览器的行为,浏览器有一个同源策略,同源策略:协议、IP地址相同就认为是同源,否则就非同源。

同源策略限定脚本请求只能请求同源的服务器返回的内容才给正常的使用;否则就会报跨域问题;

其实我们在请求CoreWebApi的时候,浏览器直接访问Api没有问题,如果是脚本请求,就会出现跨域问题;

如何解决跨域问题?

三种方式:

1.后台模拟Http请求:既然是浏览器的行为,就避开浏览器,先来一个同源的服务器去请求,然后由服务器模拟http请求去请求到CoreWebApi的资源,然后响应给前端。

2.JSONP:思路:通过html部分标签发起请求,发起请求是可以避开同源策略的,使用这些标签发起请求,然后带有一个回调函数,然后得到请求后,把回调函数之心一次,把数据解析后使用。

3.服务端允许跨域:多种方式,可以自己定义中间件支持跨域,只要把响应的Response的头信息Header中写入“Access-Control-Allow-Origin”即可支持跨域。如果需要让所有的Api都支持跨域,就可以写一个中间件从管道处理模型中去支持跨域,如果要选择性的支持跨域,可以使用ActionFilter来完成,也可以通过Cors(ASP.NETCore中提供的中间件,可以支持配置不同的跨域规则)来配置支持跨域。

Net Core 认证与授权

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

传统的授权技术:通过Session、Cookie完成授权。

实现特点: 让无状态的http请求,变的有状态,让第一次请求和第二次请求之间产生联系,第一次请求进入服务器,在服务器写入一组session,然后返回 sessionId给客户端存在Cookie,第二次请求,从cookie中渠道SessionId,传递给服务器,服务器鉴别 SessionId,如果是上一次来的SessionId,就认为之前来请求过就认为有权限。

流行鉴权授权方式:Token授权,在Core WebApi中主要就是JWT和IdentityServer4都是独立的授权中心,授权后颁发Token,然后客户端带着Token去请求Api,Api验证Token,验证通过就有权限,验证不通过就没有权限。

Net Core ORM之EFCore

请问对EFCore有了解吗?

有了解。EntityFrameworkCore是适用于.NET的新式物件资料库对应程式。其支援LINQ查询、变更追踪、更新以及结构描述移转。

EFCore透过[资料库提供者外挂程式模型]来搭配使SQLServer/SQLAzure、SQLite、AzureCosmosDB、MySQL、PostgreSQL及更多资料库。

说说EFCore查询的性能调优小技巧。

如果说查询出来的数据,只是做展示,不做增删改查,可以在查询的时候,增加AsNoTracking()方法,可以提高性能,可以避免在内存中存在副本;

建议在查询的时候,多使用Find()方法,会有限走内存缓存,如果内存已经存在,就不会去数据库中去操查询数据。

说说对SaveChanges的理解。

SaveChanges是以Context为维度的一次提交,对于数据库操作的一切动作。只要是在同一个Context实例,所有的操作,在调用SaveChanges方法后,统一体现到数据库中去。

说说对EFCore中EntityState的理解。

因为EFCore对于数据库的所有操作都是通过上下文DbContext来完成的,且是通过SaveChanges方法统一落实到数据库中去的;EntityState是EFCore在对数据库操作增删改的时候,记录当前被操作的数据对象和Context的关系,针对与不同的操作,对应的一个状态信息,一共五种状态。

//当前对象和context没有任何关系,没有被上下文跟踪
Detached = 0,
//当前对象被context跟踪,数据没有做任何修改
Unchanged=1,
//当前对象被context跟踪,且标记是数据删除,调用SaveChanges后将会从数据中删 除;
Deleted=2,   
//当前对象被context跟踪,且有属性数据被修改过,调用SaveChanges后将会从数据中 修改;
Modified=3,
//当前对象被context跟踪,且数据并没有存在数据库中,调用SaveChanges后将会新增 到数据库中去; 
Added=4  

给TA打赏
共{{data.count}}人
人已打赏
程序员

阿里四年我的收获和感想

2022-7-20 19:25:36

程序员

优秀的后端应该有哪些开发习惯?

2022-8-1 12:30:30

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索