在Asp.Net Core 上面由于現(xiàn)在前后端分離已經(jīng)是趨勢(shì),所以asp.net core MVC用的沒(méi)有那么多,主要以WebApi作為學(xué)習(xí)目標(biāo)。
一、創(chuàng)建一個(gè)WebApi項(xiàng)目
我使用的是VS2022, .Net 7版本。
在創(chuàng)建界面有幾項(xiàng)配置:
- 配置Https
- 啟用Docker
- 使用控制器
- 啟用OpenAPI支持
- 不使用頂級(jí)語(yǔ)句
其中配置Https 是WebApi是否使用https協(xié)議,啟用docker是配置服務(wù)是否docker部署支持。我們這邊作為學(xué)習(xí)就先不管docker了。
然后下面還有三個(gè)配置,第一個(gè)是說(shuō)是否使用控制器,如果使用接口服務(wù)放在Controllers文件夾下統(tǒng)一管理并且相關(guān)路由規(guī)則不一樣。
第二個(gè)啟用OpenAPI支持,如果啟用OpenAPI說(shuō)的是swagger支持,也就是說(shuō).net 自動(dòng)集成了swagger。
第三個(gè)不使用頂級(jí)語(yǔ)句,如果勾選后則程序的Program類和Main方法完整。
那么我們看下上面配置是什么意思,第二個(gè)swagger支持我們就不管了默認(rèn)開(kāi)啟。我建兩個(gè)項(xiàng)目AspNetCoreWebAPI_1、AspNetCoreWebAPI_2,AspNetCoreWebAPI_1我們勾選上【使用控制器】、【不使用頂級(jí)語(yǔ)句】。AspNetCoreWebAPI_2項(xiàng)目這兩項(xiàng)都不選。
先看下項(xiàng)目目錄結(jié)構(gòu)
不同在于AspNetCoreWebAPI_1項(xiàng)目多了Controllers文件夾和一個(gè)WeatherForecast類,WeatherForecast類是示例接口中有使用。
我們?cè)賹?duì)比一下 Program
類
可以看到在AspNetCoreWebAPI_1項(xiàng)目中Program類和Main方法完整,因?yàn)橐褂肅ontroller的原因,所以依賴注入了Controller服務(wù)。并且使用了MapControllers注冊(cè)路由。
在AspNetCoreWebAPI_2項(xiàng)目中沒(méi)有只有Main方法內(nèi)的代碼,這就是頂級(jí)語(yǔ)句。然后由于我們還使用了最小API,就是不使用Controller方式注冊(cè)和配置路由,直接在代碼中自己注冊(cè)接口和實(shí)現(xiàn)接口處理的代理方法。
按照以前asp.net習(xí)慣和項(xiàng)目清晰度維護(hù)性我們一般是使用Controller的方式,并且不使用頂級(jí)語(yǔ)句。
而最小 API,是創(chuàng)建具有最小依賴項(xiàng)的 HTTP API。 它非常適合于需要在 ASP.NET Core 中僅包括最少文件、功能和依賴項(xiàng)的微服務(wù)和應(yīng)用。
另外還有一個(gè)appsetting.json配置文件,這部分內(nèi)容也在前面已經(jīng)介紹過(guò),歡迎了解:.net 溫故知新:【8】.NET 中的配置從xml轉(zhuǎn)向json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
二、WebApi運(yùn)行
我們調(diào)試項(xiàng)目AspNetCoreWebAPI_1,此時(shí)會(huì)啟動(dòng)一個(gè)服務(wù)在后端,同時(shí)啟動(dòng)瀏覽器訪問(wèn)該站點(diǎn)的swagger,該swagger用于調(diào)我們調(diào)試webapi接口。
我們點(diǎn)擊示例接口WeatherForecast,訪問(wèn)接口會(huì)返回json格式數(shù)據(jù)。響應(yīng)的headers里面可以看到后端運(yùn)行的服務(wù)器是Kestrel,和我們以前.net framework不一樣的事需要借助IIS作為服務(wù)器。現(xiàn)在的Kestrel是包含在程序中的,這個(gè)Kestrel 以后再討論。
三、WeatherForecastController
WeatherForecastController是在創(chuàng)建項(xiàng)目后默認(rèn)生成的一個(gè)示例Controller。在該Controller中我們可以看到幾個(gè)重點(diǎn)項(xiàng)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-470786.html
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 控制器通常應(yīng)派生自 ControllerBase 而不是 Controller。 Controller 派生自 ControllerBase,并添加對(duì)視圖的支持,因此它用于處理 Web 頁(yè)面,而不是 Web API 請(qǐng)求。 如果同一控制器必須支持視圖和 Web API,則派生自 Controller。 -
[ApiController]
[ApiController] 屬性可應(yīng)用于控制器類,以啟用下述 API 特定的固定行為:
1)屬性路由要求:不能通過(guò)由 UseEndpoints、UseMvc 或 UseMvcWithDefaultRoute 定義的傳統(tǒng)路由訪問(wèn)操作,傳統(tǒng)路由就是以前老的路由規(guī)則,型如"{controller=Home}/{action=Index}/{id?}"。需要使用[Route("XX")]指定路由。
自動(dòng) HTTP 400 響應(yīng):[ApiController] 屬性使模型驗(yàn)證錯(cuò)誤自動(dòng)觸發(fā) HTTP 400 響應(yīng)。
2)綁定源參數(shù)推理:綁定源特性定義可找到操作參數(shù)值的位置,接口的參數(shù)通過(guò)推理規(guī)則應(yīng)用于操作參數(shù)的默認(rèn)數(shù)據(jù)源。
3)Multipart/form-data 請(qǐng)求推理:[ApiController] 屬性對(duì) IFormFile 和 IFormFileCollection 類型的操作參數(shù)應(yīng)用推理規(guī)則。 為這些類型推斷 multipart/form-data 請(qǐng)求內(nèi)容類型。
4)、錯(cuò)誤狀態(tài)代碼的問(wèn)題詳細(xì)信息: 將錯(cuò)誤結(jié)果(狀態(tài)代碼為 400 或更高的狀態(tài)碼)轉(zhuǎn)換為為 ProblemDetails 的結(jié)果。也就是說(shuō)狀態(tài)碼會(huì)轉(zhuǎn)換如下json格式返回信息。
{
type: "https://tools.ietf.org/html/rfc7231#section-6.5.4",
title: "Not Found",
status: 404,
traceId: "0HLHLV31KRN83:00000001"
}
-
[Route("[controller]")]
指定控制器上的屬性路由,屬性路由將應(yīng)用的功能建模為一組資源,其中操作由 HTTP 謂詞表示。也就是說(shuō)路由該屬性配置了路由,如上圖請(qǐng)求時(shí)的路由https://localhost:7122/WeatherForecast,配置中“[controller]”為標(biāo)記替換,為方便起見(jiàn),屬性路由支持標(biāo)記替換,方法是將標(biāo)記用方括號(hào)([、])括起來(lái)[controller]用于替換WeatherForecastController中WeatherForecast部分。 -
[HttpGet(Name = "GetWeatherForecast")]
HttpGet指示Get方法為Route路由的操作,即使我們將Get方法改為其他名字仍然不影響請(qǐng)求路由https://localhost:7122/WeatherForecast,并且以Get方式。這種api風(fēng)格即為Rest風(fēng)格。Rest風(fēng)格我們后面再學(xué)習(xí)。
ASP.NET Core 具有以下 HTTP 謂詞模板:- [HttpGet]
- [HttpPost]
- [HttpPut]
- [HttpDelete]
- [HttpHead]
- [HttpPatch]
-
logger日志記錄
日志記錄是基礎(chǔ)知識(shí)點(diǎn),這部分內(nèi)容在我們之前溫故知新中已經(jīng)詳細(xì)介紹過(guò),可移步了解:.net 溫故知新:【9】.NET日志記錄 ILogger使用和原理
以上為我們?nèi)腴TWebApi創(chuàng)建的一個(gè)默認(rèn)項(xiàng)目,并對(duì)創(chuàng)建選項(xiàng)、項(xiàng)目結(jié)構(gòu)、服務(wù)要點(diǎn)進(jìn)行了分析,后面將更進(jìn)一步學(xué)習(xí)分享其他asp.net core webapi重要知識(shí)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-470786.html
到了這里,關(guān)于.net 溫故知新【11】:Asp.Net Core WebAPI 入門使用及介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!