最新.NET Core面試題匯總


這幾天給.neter們整理了26道.NET Core面試題,初衷也很簡單,就是希望在面試的時候能夠幫助到大家,減輕大家的負擔和節省時間。對於沒有跳槽打算的也可以復習一下相關知識點,就當是查缺補漏!

對於還沒有學習.NET Core,或正在學習,也可以對照一下自己,掌握的熟練程度!

整理了這份C#程序員面試手冊《ASP.NET和C#面試手冊》包括以下知識點基礎語法、面向對象、集合、異常、泛型、LINQ、委托、EF、多線程、ASP.NETMVC、ASP.NETCore、ADO.NET、XML、HTTP、AJAX、WebService、常見的算法、數據庫概念知識、數據庫SQL查詢(附建表語句)

獲取word、pdf下載地址:
《ASP.NET和C#面試手冊》

1.如何在controller中注入service?

在config services方法中配置這個service。

在controller的構造函數中,添加這個依賴注入。

2.談一談對DDD的理解?

DDD,領域驅動設計。就是通過領域來指導軟件設計,是一種十分抽象的軟件設計思想,它主要分為戰略設計和戰術設計

戰略方面,通過事件風暴進行領域模型的划分,划分出核心域,子域,支撐域,定義通用語言,划分出界限上下文。

在戰術設計方面,ddd將架構分層,“松耦合,高內聚”是架構設計的整體思想。按照DDD思想,可以分為領域層,基礎設施層,應用層,接口層。

接口層為前端用戶提供api接口。基礎設施層可以放一些第三方的服務,數據庫連接等內容。應用層是對領域服務的編排,是很薄的一層(目前我自己的架構,應用的是cqrs,所有的相關邏輯都是放在了應用層,而領域層只是放了實體,因為暫時還不是特別理解領域層的服務和事件都應該寫什么)。領域層包括實體,值對象,聚合根,領域服務,領域事件等內容。

3.ASP.NET Core 比 ASP.NET 更具優勢的地方是什么?

跨平台,ASP.NET Core 可以運行在 Windows 、Linux 和 MAC 系統上;

對框架本安裝沒有依賴,所有依賴都跟程序本身在一起;

ASP.NET Core 處理請求的效率更高,進而可以處理更多的請求;

ASP.NET Core 具有更多的安裝配置方法。

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

依賴注入。

日志系統架構。

引入了一個跨平台的網絡服務器,kestrel。可以沒有iis, apache和nginx就可以單獨運行。

可以使用命令行創建應用。

使用AppSettings.json 來配置工程。

使用start up來注冊服務。

更好的支持異步編程。

支持web socket和signal IR。

對於跨網站的請求的預防和保護機制。

5.ASP.NET Core Filter如何支持依賴注入?

可以通過全局注冊,支持依賴注入

通過TypeFilter(typeof(Filter)) 標記在方法,標記在控制器

通過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($"錯誤 : {exception.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($"CustomExceptionFilterAttribute錯誤:{context.Exception.Message}");
        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,Hosting environment, 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和端口號。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM