在Asp.Net Core 上面由於現在前後端分離已經是趨勢,所以asp.net core MVC用的沒有那麼多,主要以WebApi作爲學習目標。
一、創建一個WebApi項目
我使用的是VS2022, .Net 7版本。
在創建界面有幾項配置:
- 配置Https
- 啓用Docker
- 使用控制器
- 啓用OpenAPI支持
- 不使用頂級語句
其中配置Https 是WebApi是否使用https協議,啓用docker是配置服務是否docker部署支持。我們這邊作爲學習就先不管docker了。
然後下面還有三個配置,第一個是說是否使用控制器,如果使用接口服務放在Controllers文件夾下統一管理並且相關路由規則不一樣。
第二個啓用OpenAPI支持,如果啓用OpenAPI說的是swagger支持,也就是說.net 自動集成了swagger。
第三個不使用頂級語句,如果勾選後則程序的Program類和Main方法完整。
那麼我們看下上面配置是什麼意思,第二個swagger支持我們就不管了默認開啓。我建兩個項目AspNetCoreWebAPI_1、AspNetCoreWebAPI_2,AspNetCoreWebAPI_1我們勾選上【使用控制器】、【不使用頂級語句】。AspNetCoreWebAPI_2項目這兩項都不選。
先看下項目目錄結構
不同在於AspNetCoreWebAPI_1項目多了Controllers文件夾和一個WeatherForecast類,WeatherForecast類是示例接口中有使用。
我們再對比一下 Program
類
可以看到在AspNetCoreWebAPI_1項目中Program類和Main方法完整,因爲要使用Controller的原因,所以依賴注入了Controller服務。並且使用了MapControllers註冊路由。
在AspNetCoreWebAPI_2項目中沒有隻有Main方法內的代碼,這就是頂級語句。然後由於我們還使用了最小API,就是不使用Controller方式註冊和配置路由,直接在代碼中自己註冊接口和實現接口處理的代理方法。
按照以前asp.net習慣和項目清晰度維護性我們一般是使用Controller的方式,並且不使用頂級語句。
而最小 API,是創建具有最小依賴項的 HTTP API。 它非常適合於需要在 ASP.NET Core 中僅包括最少文件、功能和依賴項的微服務和應用。
另外還有一個appsetting.json配置文件,這部分內容也在前面已經介紹過,歡迎瞭解:.net 溫故知新:【8】.NET 中的配置從xml轉向json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
二、WebApi運行
我們調試項目AspNetCoreWebAPI_1,此時會啓動一個服務在後端,同時啓動瀏覽器訪問該站點的swagger,該swagger用於調我們調試webapi接口。
我們點擊示例接口WeatherForecast,訪問接口會返回json格式數據。響應的headers裏面可以看到後端運行的服務器是Kestrel,和我們以前.net framework不一樣的事需要藉助IIS作爲服務器。現在的Kestrel是包含在程序中的,這個Kestrel 以後再討論。
三、WeatherForecastController
WeatherForecastController是在創建項目後默認生成的一個示例Controller。在該Controller中我們可以看到幾個重點項。
using Microsoft.AspNetCore.Mvc;
namespace AspNetCoreWebAPI_1.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
}
- ControllerBase 基類
web API 控制器通常應派生自 ControllerBase 而不是 Controller。 Controller 派生自 ControllerBase,並添加對視圖的支持,因此它用於處理 Web 頁面,而不是 Web API 請求。 如果同一控制器必須支持視圖和 Web API,則派生自 Controller。 - [ApiController]
[ApiController] 屬性可應用於控制器類,以啓用下述 API 特定的固定行爲:
1)屬性路由要求:不能通過由 UseEndpoints、UseMvc 或 UseMvcWithDefaultRoute 定義的傳統路由訪問操作,傳統路由就是以前老的路由規則,型如"{controller=Home}/{action=Index}/{id?}"。需要使用[Route("XX")]指定路由。
自動 HTTP 400 響應:[ApiController] 屬性使模型驗證錯誤自動觸發 HTTP 400 響應。
2)綁定源參數推理:綁定源特性定義可找到操作參數值的位置,接口的參數通過推理規則應用於操作參數的默認數據源。
3)Multipart/form-data 請求推理:[ApiController] 屬性對 IFormFile 和 IFormFileCollection 類型的操作參數應用推理規則。 爲這些類型推斷 multipart/form-data 請求內容類型。
4)、錯誤狀態代碼的問題詳細信息: 將錯誤結果(狀態代碼爲 400 或更高的狀態碼)轉換爲爲 ProblemDetails 的結果。也就是說狀態碼會轉換如下json格式返回信息。
{
type: "https://tools.ietf.org/html/rfc7231#section-6.5.4",
title: "Not Found",
status: 404,
traceId: "0HLHLV31KRN83:00000001"
}
- [Route("[controller]")]
指定控制器上的屬性路由,屬性路由將應用的功能建模爲一組資源,其中操作由 HTTP 謂詞表示。也就是說路由該屬性配置了路由,如上圖請求時的路由https://localhost:7122/WeatherForecast,配置中“[controller]”爲標記替換,爲方便起見,屬性路由支持標記替換,方法是將標記用方括號([、])括起來[controller]用於替換WeatherForecastController中WeatherForecast部分。 - [HttpGet(Name = "GetWeatherForecast")]
HttpGet指示Get方法爲Route路由的操作,即使我們將Get方法改爲其他名字仍然不影響請求路由https://localhost:7122/WeatherForecast,並且以Get方式。這種api風格即爲Rest風格。Rest風格我們後面再學習。
ASP.NET Core 具有以下 HTTP 謂詞模板:- [HttpGet]
- [HttpPost]
- [HttpPut]
- [HttpDelete]
- [HttpHead]
- [HttpPatch]
- logger日誌記錄
日誌記錄是基礎知識點,這部分內容在我們之前溫故知新中已經詳細介紹過,可移步瞭解:.net 溫故知新:【9】.NET日誌記錄 ILogger使用和原理
以上爲我們入門WebApi創建的一個默認項目,並對創建選項、項目結構、服務要點進行了分析,後面將更進一步學習分享其他asp.net core webapi重要知識。