從零開始學習 asp.net core 3.1 web api 後端api基礎框架(二)-創建項目

目錄

一、創建項目

1.選擇【文件】→【新建】→【項目】

2.創建【ASP.NET Core Web 應用程序】,點擊 下一步

3.項目名稱爲CoreBackend.Api,點擊 創建

4.選【ASP.NET Core 3.1】、【空】 點擊 創建

5.打開Program.cs,安裝包“Microsoft.Extensions.Hosting.Abstractions”,查找並安裝最新版本

二.解讀項目

1. 解讀項目生成的代碼 Program.cs

2. 解讀項目生成的代碼 Startup.cs

三、註冊並使用Controllers


一、創建項目

1.選擇【文件】→【新建】→【項目】

2.創建【ASP.NET Core Web 應用程序】,點擊 下一步

3.項目名稱爲CoreBackend.Api,點擊 創建

4.選【ASP.NET Core 3.1】、【空】 點擊 創建

5.打開Program.cs,安裝包“Microsoft.Extensions.Hosting.Abstractions”,查找並安裝最新版本

二.解讀項目

1. 解讀項目生成的代碼 Program.cs

這個Program是程序的入口, 看起來很眼熟, 是因爲Asp.Net Core Application實際就是控制檯程序(Console Application).
它是一個調用Asp.Net Core 相關庫的Console Application。

Main方法是整個項目的入口方法。這裏Main只有一行代碼,但是實際上執行了三個函數:
1、IHostBuilder builder= CreateHostBuilder(args);
2、IHost host=builder.Build;
3、host.Run;

1、通過CreateHostBuilder(args)方法產生一個IhostBuilder的實例builder。
2、通過builder.Build方法產生一個Ihost的實例host。
3、通過host.Run方法,開始運行Web項目,這時候就可以響應各種請求了。

創建並配置主機:爲了方便閱讀,把這個Lamada表達式還原下:

1、使用預配置默認值初始化HostBuilder類的新實例builder。(讀取appsettings.json)

2、webBuilder.UseStartup<Startup>();讀取startup類配置信息。

3、通過builder.ConfigureWebHostDefaults(Action <IWebHostBuilder >)方法將IHostBuilder實例轉變爲一個Web主機性質的webbuilder(IWebHostBuilder)。

 

Asp.Net Core 自帶了兩種http servers, 一個是WebListener, 它只能用於Windows系統, 另一個是Kestrel, 它是跨平臺的。
Kestrel是默認的Web Server, 就是通過UseKestrel()這個方法來啓用的。
但是我們開發的時候使用的是IIS Express, 調用UseIISIntegration()這個方法是啓用IIS Express, 它作爲Kestrel的Reverse Proxy Server(反向代理)來用。
如果在Windows服務器上部署的話, 就應該使用IIS作爲Kestrel的反向代理服務器來管理和代理請求。
如果在Linux上的話, 可以使用Apache, Nginx等等的作爲Kestrel的Proxy Server。
當然也可以單獨使用Kestrel作爲Web 服務器, 但是使用IIS作爲Reverse Proxy還是由很多有點的: 例如,IIS可以過濾請求, 管理證書, 程序崩潰時自動重啓等。

2. 解讀項目生成的代碼 Startup.cs

其實Startup算是程序真正的切入點。

ConfigureServices方法是用來把services(各種服務, 例如identity, ef, mvc等等包括第三方的, 或者自己寫的)加入(register)到container(asp.net core的容器)中去, 並配置這些services. 這個container是用來進行dependency injection的(依賴注入). 所有注入的services(此外還包括一些框架已經註冊好的services) 在以後寫代碼的時候, 都可以將它們注入(inject)進去。例如上面的Configure方法的參數, app, env都是注入進去的services。

Configure方法是asp.net core程序用來具體指定如何處理每個http請求的, 例如我們可以讓這個程序知道我使用mvc來處理http請求, 那就調用app.UseMvc()這個方法就行。 但是目前, 所有的http請求都會導致返回"Hello World!".

這幾個方法的調用順序: Main -> ConfigureServices -> Configure

請求管道和中間件(Request Pipeline, Middleware)

請求管道: 那些處理http requests並返回responses的代碼就組成了request pipeline(請求管道).
中間件: 我們可以做的就是使用一些程序來配置那些請求管道 request pipeline以便處理requests和responses. 比如處理驗證(authentication)的程序, 連MVC本身就是個中間件(middleware).

image

每層中間件接到請求後都可以直接返回或者調用下一個中間件. 一個比較好的例子就是: 在第一層調用authentication驗證中間件, 如果驗證失敗, 那麼直接返回一個表示請求未授權的response。

在上面【圖 Startup.cs】中,app.UseDeveloperExceptionPage(); 就是一個middleware, 當exception發生的時候, 這段程序就會處理它. 而判斷env.isDevelopment() 表示, 這個middleware只會在Development環境下被調用。
可以在項目的屬性Debug頁看到這個設置: 


需要注意的是這個環境變量Development和VS裏面的Debug Build沒有任何關係。

在正式環境中, 我們遇到exception的時候, 需要捕獲並把它記錄(log)下來, 這時候我們應該使用這個middleware: Exception Handler Middleware, 我們可以這樣調用它:

if (env.IsDevelopment())
  {
      app.UseDeveloperExceptionPage();
  }
  else
  {
      app.UseExceptionHandler();
  }


UseExceptionHandler是可以傳參數的, 但暫時先這樣, 我們在app.Run方法裏拋一個異常, 然後運行程序, 在Chrome裏按F12就會發現有一個(或若干個, 多少次請求, 就有多少個錯誤)500錯誤。

三、註冊並使用Controllers

services.AddControllers(); //添加對控制器和與 API 相關的功能,但不是視圖或頁面的支持。
services.AddControllersWithViews(); //添加對控制器、 與 API 相關的功能,和視圖,但不是頁面的支持。
services.AddRazorPages(); //添加支持 Razor 頁面和最小控制器支持。

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers(); // 註冊Controllers到Container
        }

由於路由現在包括對不止是 MVC 的支持,已更改了術語進行明確說明他們所做的這些方法。 
MapControllers 添加了對屬性路由的控制器支持。
MapAreaControllerRoute 將控制器的傳統路由添加區域。
MapControllerRoute 添加控制器的常規路由。

我們這兒添加MapControllers :

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }


跑一下, 試試效果:
Chrome顯示了一個錯誤頁, 顯示了404 Not Found錯誤。


這是因爲我只添加了Controllers middleware, 但是它啥也沒做, 也沒有找到任何可用於處理請求的代碼, 所以我們要添加Controller來返回數據/資源等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章