.Net Core3.0 WebApi 目錄
開發環境
Visual Studio 2019
.net core 3.1
創建項目
新建.net core web項目,如果沒有安裝.net core sdk的使用vs2019的安裝中心安裝,這里默認已經安裝了.net core 3.1
此處我們選擇API(選擇API系統會為我們自動創建WebApi需要的一些配置文件等),Https配置這一項我們暫時不勾選,目前我們不配置Https。
點擊創建,完成后,如下圖所示:(我在這里創建了幾個解決方案文件,用於代碼分布,個人習慣)
Program.cs 說明
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
這個Program是程序的入口, 看起來很眼熟, 是因為asp.net core application實際就是控制台程序(console application).
它是一個調用asp.net core 相關庫的console application.
Main方法里面的內容主要是用來配置和運行程序的.
因為我們的web程序需要一個宿主, 所以 BuildWebHost這個方法就創建了一個WebHostBuilder. 而且我們還需要Web Server.
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可以過濾請求, 管理證書, 程序崩潰時自動重啟等.
UseStartup<Startup>(), 這句話表示在程序啟動的時候, 我們會調用Startup這個類.
Build()完之后返回一個實現了IWebHost接口的實例(WebHostBuilder), 然后調用Run()就會運行Web程序, 並且阻止這個調用的線程, 直到程序關閉.
Startup.cs 說明
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllers(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } }
其實Startup算是程序真正的切入點.
ConfigureServices方法是用來把services(各種服務, 例如identity, sqlsugar,swagger等等包括第三方的, 或者自己寫的)加入(register)到container(asp.net core的容器)中去, 並配置這些services. 這個container是用來進行dependency injection的(依賴注入). 所有注入的services(此外還包括一些框架已經注冊好的services) 在以后寫代碼的時候, 都可以將它們注入(inject)進去. 例如上面的Configure方法的參數, app, env, loggerFactory都是注入進去的services.
Configure方法是asp.net core程序用來具體指定如何處理每個http請求的, 例如我們可以讓這個程序知道我使用路由規則來處理http請求, 那就調用app.UseRouting()這個方法就行
項目調試
.net core 調試的兩種方法有兩種,IIS調試和項目自帶的Kestrel web應用調式,這里從 launchsettings.json刪除IIS調試使用Kestrel web就行。
launchsettings.json是程序的啟動配置文件,關於 launchsettings.json可以參考https://www.cnblogs.com/wer-ltm/p/11028234.html
運行程序
瀏覽器顯示的是官方提供的一個現實天氣信息的api
創建第一個Controller
刪除系統默認創建的WeatherForecastController.cs
和WeatherForecast.cs並在controller文件夾
新建一個控制器,命名:UserController.cs
新建成功之后如下所示:
namespace WebApi.Core.Api.Controllers { [Route("api/[controller]")] [ApiController] public class UserController : ControllerBase { } }
我們在UserController
中增加一個hello
的get
方式的接口方法,返回一個hello world
,我們打算通過請求api/user/hello
來得到這個hello
[Route("api/[controller]")] [ApiController] public class UserController : ControllerBase { [HttpGet] public IActionResult Hello() { return Ok("Hello World , Core3.0 WebApi"); } }
運行,如下所示:
有些運行是會提示404,我在最開始的時候也遇到過,之前的一篇隨筆也有記錄到。404不用緊張,我們找到問題所在就好了。
首先在Controller中將[Route("[controller]")]====》[Route("api/WeatherForecast")],再在launchSettings.json中做修改。
這樣就OK了。
增加全局路由
上面增加action
雖然能達到想要的結果,但是每次新建一個Controller
都有寫個action,有點麻煩,如果哪天領導不高興,要改規則,有點麻煩的,如果定義一個全局規則,那么只需要修改一個地方,所有的規則都變了。
首先去掉Controller里的Route
和ApiController
修改Startup.cs
,增加路由模版
這樣所有的控制台都可以遵循這個規則來訪問。