.NET Core笔试题

1.如何在 ASP.NET Core 中激活 Session 功能?

首先要添加 session 包. 其次要在 configservice 方法里面添加 session。然后又在 configure 方法里面调用 usesession。。

2.什么是中间件?

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

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

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

4.如何使 taghelper 在元素这一层上失效?

使用叹号。

5.什么是 ASP.NET Core?

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

6.ASP.NET Core 中 AOP 的支持有哪些?

通过 Filter 来支持;分别有 IResourceFilter AuthorizeFilter ActionFilter ExceptionFilter ResultFilter, Filter 也被称为拦截器!

7.ASP.NET Core Filter 的注册方式有哪些?

方法注册:只对方法生效 控制器注册:对控制器中的所有方法生效 全局注册:对整个项目生效;

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

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

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

可以有两种方式,可以通过 IConfiguration 接口来读取;有可以定义根据配置文件结构一致的实体对象,来绑定到对象中去;或者通过 1 写入,2 注入读取 必须保证:DBConnectionOption 和配置文件的内容结构一致;

1. services.Configure<DBConnectionOption>
(Configuration.GetSection("ConnectionStrings"));//注入多个链接
2.private DBConnectionOption dBConnections = null;
       private DbContext _Context = null;
        
       public DbContextFactory(DbContext context, IOptions<DBConnectionOption>
options)
       {
           _Context = context;
           dBConnections = options.Value;
       }

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

第一是依赖注入。第二是日志系统架构。第三是引入了一个跨平台的网络服务器,kestrel。可以没有 iis, apache 和 nginx 就可以单独运行。第四是可以使用命令行创建应用。第五是使用 appsettings 来配置工程。第六是使用 startup 来注册服务。第七是更好的支持异步编程。第八是支持 web socket 和 signal IR。第九是对于跨网站的请求的预防和保护机制。

11.ASP.NET Core 跟 ASP.NET 比较有哪些更好的地方?、

第一是跨平台,它可以运行在三大操作系统上面,windows, Linux 和 MAC。第二是对架构本身安装没有依赖,因为所有的依赖都跟程序本身在一起。第三是 ASP.NET Core 处理请求的效率更高,能够处理更多的请求。第四是 ASP.NET Core 有更多的安装配置方法。

12.什么是 meta packages?

Meta packages 是指包含所有 ASP dot net code 依赖的一个包。叫做 Microsoft.AspNetCore

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

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

14.什么是 ASP.NET Core 的 startup 类?

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

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

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


1.services.Configure
(Configuration.GetSection("ConnectionStrings"));//注入多个链接

2.private DBConnectionOption dBConnections = null;

   private DbContext _Context = null;

    
   public DbContextFactory(DbContext context, IOptions<DBConnectionOption>
options)

   {
       _Context = context;
       dBConnections = options.Value;
   }

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

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

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

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

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

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

19.ASP.NET Core 工程里面有多少个工程文件?

launchsetting,appsettings,Program, Startup

20.什么是 ASP.NET Core 里面的 taghelper

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

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

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

22.什么是 Razor 页面?

是 ASP.NET Core 中支持 ASP 网页表格的一种开发模型。@page 作为页面的起始标志。。Stringbulider 的使用,最好制定合适的容量值,否则优于默认值容量不足而频繁的进行内存分

23.说说.NET5 中 __ViewStart 文件的作用

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

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

使用 bindproperty 属性。

25.如何在 Controller 中注入 service?

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

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

在 ASP.NET Core 中,我们不需要关心如何释放这些服务, 因为系统会帮我们释放掉。有三种服务的生命 周期。单实例服务, 通过 add singleton 方法来添加。在注册时即创建服务, 在随后的请求中都使用这一个服 务。短暂服务, 通过 add transient 方法来添加。是一种轻量级的服务,用于无状态服务的操作。作用域服务,一个新的请求会创建一个服务实例。使用 add scoped 方法来添加。

27.说说 ASP.NET Core 内置容器的特点;

ASP.NET Core 内置容器 IServiceCollection,只支持构造函数注入;支持三种声明周期:单例、瞬时、 Scoped 三种声明周期管理;

28.ASP.NET Core 中如何读取静态文件?

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

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

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

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

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

31.谈谈对 ASP.NET Core kestrel 的理解。

Kestrel 是一个跨平台的适用于 ASP.NET Core 的 Web 服务器。Kestrel 是 Web 服务器,默认包括在 ASP.NET Core 项目模板中。Kestrel 支持以下方案:HTTPS

28 用于启用 WebSocket 的不透明升级 用于获得 Nginx 高性能的 Unix 套接字 HTTP/2(除 macOS† 以外) macOS 的未来版本将支持 †HTTP/2。.NET Core 支持的所有平台和版本均支持 Kestrel。

32.谈谈对 Autofac 的理解;

Autofac 是一个 IOC 容器,支持三种类型的 DI 依赖注入,配置文件配置映射关系,支持 AOP 扩展定制; 在 ASP.NET Core 的使用步骤如下:1.Nuget 引入 Autofac 程序集 2.在 Program 类中的 CreateHostBuilder 方法中,通过.UseServiceProviderFactory(new AutofacServiceProviderFactory())替换容器工厂,把容器替换到框架中;3.在 Startup 中增加 ConfigureContainer 方法,用来配置映射关系 4.就可以在控制器中配置构造函数注入了

33.ASP.NET Core 如何支持 Log4Net 扩展?

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

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

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

public void ConfigureContainer(ContainerBuilder builder) {

}

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

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

34.说说脚本启动 ASP.NET Core Web 项目

介绍两种方式:第一种:定位到 Web 项目的编译地址下,就是 bin 文件夹下的.NET5 文件夹,然后在当前文件夹下打开命 令提示窗口;dotnet dll 文件 —urls=http://ip 地址:端口号 回车即可;第二种:定位到 Web 项目的根目录下,然后在当前文件夹下打开命令提示窗口;dotnet run —urls=ht tp://ip 地址:端口号 回车即可;推按第二种,第二种方式,在启动的时候,会自动编译项目,然后启动 dll 文件;

35.说说 Core WebApi 的 Swagger。

Swagger 是一个 Api 说明文档,支持 Api 测试;现在 CoreWebApi 开发使用 swagger 还挺多的;在.NET5 中已经内置了 Core WebApi;配置流程如下:1.Nuget 引入程序集:Swashbuckle.AspNetCore.SwaggerGen 2.配置服务:public static IHostBuilder CreateHostBuilder(string[] args) {
return Host.CreateDefaultBuilder(args) //创建默认主机的建造者;.ConfigureLogging(loggbuild => { loggbuild = loggbuild.AddLog4Net(“CfgFile/log4net.Config”); })   ///配置 logging(指定使用 Log4net) .ConfigureWebHostDefaults(webBuilder =>
{ webBuilder.UseStartup(); //如何配置?配置全交给 Startup 来完 成;}).UseServiceProviderFactory(new AutofacServiceProviderFactory()); } public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc(“v1”, new OpenApiInfo { Title = “WebApplication1”, Version = “v1” }); }); } 3.配置使用中间件

36.说说 Core WebApi 特性路由。

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

37.说说 RESTful 是什么。

在传统的服务中,比方说 WebService,WCF,Remouting,都是通过调用方法来做到一个进程去调用另 外一个进程的服务,在 Core WebApi 中是把要调用的服务资源化,比方说有图书资源,Books,学生资 源 Studentlist,每一个资源对应一个控制器,然后对外提供增删改查等操作;对外提供统一的 Uri, 可以 对资源 Books,资源 Studentlist 做增删改查的操作;访问的是资源,可以根据不同的额访问方式,做不 同的事儿;

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

跨域问题:本质是浏览器的行为,浏览器有一个同源策略,同源策略:协议、IP 地址相同就认为是同 源;否则就非同源;同源策略限定脚本请求只能请求同源的服务器返回的内容才给正常的使用;否则就 会报跨域问题;其实我们在请求 Core WebApi 的时候,浏览器直接访问 Api 没有问题,如果是脚本请求, 就会出现跨域问题;

39.如何解决跨域问题?

三种方式:

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

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

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

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

1.传统的授权技术:通过 Session、Cookie 完成授权;实现特点: 让无状态的 http 请求,变的有状态,让 第一次请求和第二次请求之间产生联系,第一次请求进入服务器,在服务器写入一组 session,然后返回 sessionId 给客户端存在 Cookie,第二次请求,从 cookie 中渠道 SessionId,传递给服务器,服务器鉴别 SessionId,如果是上一次来的 SessionId,就认为之前来请求过;就认为有权限;public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint(“/swagger/v1/swagger.json”, “WebApplication1 v1”)); }

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

41.请问对 gRPC 有了解吗,说说 gRPC。

有了解,说 gRPC 可以先说 RPC,PRC:所谓 RPC(remote procedure call 远程过程调用)框架实际是提供了 一套机制,使得应用程序之间可以进行通信,而且也遵从 server/client 模型。使用的时候客户端调用 server 端提供的接口就像是调用本地的函数一样。所谓 gRPC 是由谷歌开发的一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.

42.gRPC 有几种模式?

四种模式:

1,简单模式:简单模式只是使用参数和返回值作为服务器与客户端传递数据的方式,最简单。

2,客户端流模式:即从客户端往服务器端发送数据使用的是流,即服务器端的参数为流类型,然而在服 务器相应后返还数据给客户端,使用的也是流的 send 方法。一般在服务器端的代码,需要先 recv 再 send,而客户端与此相反。但是在后面的双向模式中可以使用 go 的协程协作。

3,服务器端流模式:即服务器端返回结果的时候使用的是流模式,即传入的数据是通过参数形式传入 的。但是在往客户端发送数据时使用 send 方法,与客户端返回数据的方式大同小异。

4,双向模式:客户端如果不适用协程,那么发送必须在接收之前。如果使用协程,发送与接收并没有先 后顺序。为了保证协程的同步,可以使用互斥量进行约束。

43.说说如何使用 C#实现简单模式 gRPC

分为客户端和服务端;

服务端:

1.通过 vs 新建一个 gRPC 服务,会内置一 proto 文件;内容如下,可以理解成是一个模板,通过这个模板 可以生成对应的类文件。syntax = “proto3”; //规范—标准—工具生成 C# option csharp_namespace = “Zhaoxi.gRPCDemo.DefaultServer”; package greet; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply); } // The request message containing the user’s name. message HelloRequest { string name = 1; }

2.需要让这个文件生效,就必须要在项目文件中配置使用这个文件;GrpcServices=“Server”,这是服务端 的配置;

3.编译,就可以通过这个模板生成一些类,包含这些类的方法;

客户端:

1.Vs 新建一个控制台,作为客户端

2.把服务端的那个 proto 文件,连同文件一起 Copy 到客户端来。

3.配置客户端的项目文件,如下。请注意 GrpcServices=“Client”

4.编译后,编写调用 gRPC 的方法如下:

private static async Task TestHello()
{
     using (var channel = GrpcChannel.ForAddress("https://localhost:5001"))
     {
       var client = new Greeter.GreeterClient(channel);
       var reply = await client.SayHelloAsync(new HelloRequest { Name = "朝夕教
育" });
       Console.WriteLine("Greeter 服务返回数据: " + reply.Message); 
     }
 }

44.说说 gRPC 的拦截器有哪些?

分为客户端拦截器,和服务端连接器,是 AOP 的编程思想的体现。

分别有:BlockingUnaryCall:拦截阻塞调用 AsyncUnaryCall: 拦截异步调用 AsyncServerStreamingCall 拦截异步服务端流调用 AsyncClientStreamingCall 拦截异步客户端流调用 AsyncDuplexStreamingCall 拦截异步双向流调用 // The response message containing the greetings. message HelloReply { string message = 1; }private static async Task TestHello() { using (var channel = GrpcChannel.ForAddress(“https://localhost:5001”)) { var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync(new HelloRequest { Name = “朝夕教 育” }); Console.WriteLine(“Greeter 服务返回数据: ” + reply.Message); } } UnaryServerHandler 用于拦截和传入普通调用服务器端处理程序 ClientStreamingServerHandler 用户拦截客户端流调用的服务端处理程序 ServerStreamingServerHandler 用于拦截服务端流调用的服务器端处理程序 DuplexStreamingServerHandler 用于拦截双向流调用的服务器端处理程序

45.gPRC 作为一种被调用的服务,有什么保护安全的措施吗?

有的,可以使用 JWT,无论是对称可逆加密还是非对称可逆加密,都是可以支持的;

46.请问对 EFCore 有了解吗?

有了解。Entity Framework Core 是适用于.NET 的新式物件资料库对应程式。其支援 LINQ 查询、变更追踪、更新 以及结构描述移转。EF Core 透过[资料库提供者外挂程式模型]来搭配使用 SQL Server/SQL Azure、SQLite、Azure Cosmos DB、MySQL、PostgreSQL 及更多资料库。。、

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

如果说查询出来的数据,只是做展示,不做增删改查,可以在查询的时候,增加 AsNoTracking()方法, 可以提高性能,可以避免在内存中存在副本;建议在查询的时候,多使用 Find()方法,会有限走内存缓存,如果内存已经存在,就不会去数据库中去操 查询数据;

48.EFCore 如果通过数据生成实体和 DbContext?

步骤如下:1.Nuget 引入 如下程序集 2.在 Vs 中打开工具–nuget 包管理器–程序包管理器控制台:命令执行:Scaffold-DbContext “Data Source=DESKTOP-63QE7M1;Initial Catalog=ZhaoxiEduDataBase;User ID=sa;Password=sa123” Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entity -Force – Context ZhaoxiDbContext -ContextDir / 注:命令参数应用如下:Install-Package Microsoft.EntityFrameworkCore Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools 命令参数:-OutputDir *** 实体文件所存放的文件目录 -ContextDir *** DbContext 文件存放的目录 -Context *** DbContext 文件名 -Schemas *** 需要生成实体数据的数据表所在的模式 -Tables *** 需要生成实体数据的数据表的集合 -DataAnnotations -UseDatabaseNames 直接使用数据库中的表名和列名(某些版本不支持) -Force 强制执行,重写已经存在的实体文件

49.说说对 SaveChanges 的理解。

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

51.说说对 EFCore 中 EntityState 的理解。

因为 EFCore 对于数据库的所有操作都是通过上下文 DbContext 来完成的,且是通过 SaveChanges 方法统 一落实到数据库中去的;EntityState 是 EFCore 在对数据库操作增删改的时候,记录当前被操作的数据对 象和 Context 的关系,针对与不同的操作,对应的一个状态信息,一共五种状态;一共五种:Detached = 0, 当前对象和 context 没有任何关系,没有被上下文跟踪 Unchanged=1, 当前对象被 context 跟踪,数据没有做任何修改 Deleted=2, 当前对象被 context 跟踪,且标记是数据删除,调用 SaveChanges 后将会从数据中删 除;Modified=3, 当前对象被 context 跟踪,且有属性数据被修改过,调用 SaveChanges 后将会从数据中 修改;Added=4 当前对象被 context 跟踪,且数据并没有存在数据库中,调用 SaveChanges 后将会新增 到数据库中去;

52.说说什么是导航属性和引用属性。

实体框架 中的导航属性提供了一种在两个实体类型之间导航关联的方法。导航属性在概念模型中由 NavigationProperty 元素 (CSDL) 定义。针对对象参与到其中的每个关系,各对象均可以具有导航属 性。使用导航属性,您可以在两个方向上导航和管理关系,如果重数为一或者零或一,则返回 EntityReference,或者如果重数为多个,则返回 EntityCollection。也可以选择单向导航,这种情况下 可以删除导航属性。

 

 

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...