《ASP.NET Core 微服务实战》-- 读书笔记(第7章)
第 7 章 開發(fā) ASP.NET Core Web 應(yīng)用
ASP.NET Core 基礎(chǔ)
在本章,我們將從一個(gè)命令行應(yīng)用開始,并且在不借助任何模板,腳手架和向?qū)У那闆r下,最終得到一個(gè)功能完整的 Web 應(yīng)用
GitHub鏈接:https://github.com/microservices-aspnetcore/hello-world
運(yùn)行 dotnet new console 命令之后,我們首先得到一個(gè) Program.cs 文件,修改該文件并添加配置支持
using System; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration;namespace StatlerWaldorfCorp.HelloWorld {public class Program{public static void Main(string[] args){var config = new ConfigurationBuilder().AddCommandLine(args).Build();var host = new WebHostBuilder().UseKestrel().UseStartup<Startup>().UseConfiguration(config).Build();host.Run();}} }之后添加一個(gè) Startup 類,用于配置默認(rèn)的中間件,它對所有 HTTP 請求都返回 "Hello World" 響應(yīng)
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Logging; using Microsoft.AspNetCore.Http;namespace StatlerWaldorfCorp.HelloWorld {public class Startup{public Startup(IHostingEnvironment env){}public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){app.Run(async (context) =>{await context.Response.WriteAsync("Hello, world!\n");});}} }添加 NuGet 包作為項(xiàng)目的依賴,并直接在項(xiàng)目文件開頭處聲明要使用的 Web SDK
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp1.1</TargetFramework></PropertyGroup><ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.1" /><PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="1.1.1"/><PackageReference Include="Microsoft.Extensions.Logging" Version="1.1.1"/><PackageReference Include="Microsoft.Extensions.Logging.Console" Version="1.1.1"/><PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1"/><PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="1.1.1"/></ItemGroup></Project>添加 ASP.NET MVC 中間件
GitHub鏈接:https://github.com/microservices-aspnetcore/webapp
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Configuration;namespace StatlerWaldorfCorp.WebApp {public class Startup{public Startup(IHostingEnvironment env){}public IConfiguration Configuration { get; set; }public void ConfigureServices(IServiceCollection services) {services.AddMvc();}public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){app.UseMvc(routes =>{routes.MapRoute("default",template: "{controller=Home}/{action=Index}/{id?}");});}} }為了讓它生效,我們還需要添加 NuGet 包依賴:Microsoft.AspNetCore.Mvc
添加控制器
控制器專門負(fù)責(zé):
(1)接收來自 HTTP 請求的輸入
(2)將輸入轉(zhuǎn)交給與 HTTP 通信、JSON解析無關(guān)的服務(wù)類處理
(3)返回合適的響應(yīng)代碼及正文
只要向文件中加入上面的內(nèi)容,此前創(chuàng)建的路由就能自動(dòng)檢測到這個(gè)控制器并讓它生效
添加模型
我們創(chuàng)建了一個(gè)用于表示股票報(bào)價(jià)的簡單模型
namespace StatlerWaldorfCorp.WebApp.Models {public class StockQuote{public string Symbol { get; set; }public int Price { get; set; }} }添加視圖
<html> <head><title>Hello world</title> </head> <body><h1>Hello World</h1><div><h2>Stock Quote</h2><div>Symbol: @Model.Symbol<br/>Price: $@Model.Price<br/></div></div> </body> </html>現(xiàn)在,我們可用修改 HomeController,不再返回示例文本,而是呈現(xiàn)視圖
using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; using StatlerWaldorfCorp.WebApp.Models;namespace StatlerWaldorfCorp.WebApp.Controllers {public class HomeController : Controller{public IActionResult Index(){var model = new StockQuote { Symbol = "HLLO", Price = 3200 };return View(model);}} }如果現(xiàn)在運(yùn)行應(yīng)用,很可能會(huì)收到 HTTP 500 響應(yīng)
由于我們開發(fā)的是 Web 應(yīng)用,因而一定希望能查看所有發(fā)生錯(cuò)誤的堆棧信息
可用向 Startup 類的 Configure 方法中加入一行調(diào)用 UseDeveloperExceptionPage 的代碼,實(shí)現(xiàn)這一需求
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration;namespace StatlerWaldorfCorp.WebApp {public class Startup{public Startup(IHostingEnvironment env){var builder = new ConfigurationBuilder().SetBasePath(env.ContentRootPath).AddEnvironmentVariables();Configuration = builder.Build();}public IConfiguration Configuration { get; set; }public void ConfigureServices(IServiceCollection services) {services.AddMvc();}public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){loggerFactory.AddConsole();loggerFactory.AddDebug();app.UseDeveloperExceptionPage();app.UseMvc(routes =>{routes.MapRoute("default",template: "{controller=Home}/{action=Index}/{id?}");});app.UseStaticFiles();}} }有了新的 Startup 類,我們應(yīng)該能夠通過 dotnet restore 以及 dotnet run 啟動(dòng)應(yīng)用
從 JavaScript 中調(diào)用 REST API
首先,我們通過添加新的控制器來創(chuàng)建 API 端點(diǎn)
using Microsoft.AspNetCore.Mvc; using StatlerWaldorfCorp.WebApp.Models;namespace StatlerWaldorfCorp.WebApp.Controllers {[Route("api/test")]public class ApiController : Controller{[HttpGet]public IActionResult GetTest(){return this.Ok(new StockQuote { Symbol = "API", Price = 9999 });}} }如果現(xiàn)在再運(yùn)行應(yīng)用,可用打開瀏覽器并訪問 http://localhost:5000/api/test,應(yīng)該能看到一個(gè) JSON 響應(yīng)
{"symbol" : "API","price" : 9999 }有了可供消費(fèi)的 API 后,現(xiàn)在來修改我們唯一的視圖,讓它調(diào)用 JavaScript 來消費(fèi)這個(gè) API
<html> <head><title>Hello world</title><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script><script src="/Scripts/hello.js"></script> </head> <body><h1>Hello World</h1><div><h2>Stock Quote</h2><div>Symbol: @Model.Symbol<br/>Price: $@Model.Price<br/></div></div><br/><div><p class="quote-symbol">The Symbol is </p><p class="quote-price">The price is $</p></div> </body> </html>注意,這里決定引入一個(gè) jQuery,以及一個(gè)新腳本 hello.js
我們按照約定,把它添加到名為 wwwroot 的新目錄 wwwroot/Scripts/hello.js
$(document).ready(function () {$.ajax({url: "/api/test"}).then(function (data) {$('.quote-symbol').append(data.symbol);$('.quote-price').append(data.price);}); });這些 jQuery 代碼非常直觀,它們向 API 端點(diǎn)發(fā)送 Ajax 請求,返回的對象會(huì)包含 symbol 和 price 屬性,它們將被附加到新添加的段落標(biāo)簽之中
開發(fā)云原生 Web 應(yīng)用
(1)API 優(yōu)先
(2)配置
(3)日志
(4)會(huì)話狀態(tài)
(5)數(shù)據(jù)保護(hù)
(6)后端服務(wù)
(7)環(huán)境均等
(8)端口綁定
(9)遙測
(10)身份驗(yàn)證和授權(quán)
會(huì)話狀態(tài)
云原生 Web 應(yīng)用基本上不可能再使用基于內(nèi)存的會(huì)話狀態(tài)了,而必須使用進(jìn)程外的提供程序
數(shù)據(jù)保戶
如果涉及數(shù)據(jù)保護(hù),”進(jìn)程外存儲(chǔ)“的思路同樣適用于密鑰存儲(chǔ)
我們要使用一種現(xiàn)成的密鑰保管庫,可以是基于云的密鑰保管庫,也可以是基于 Redis 或其他數(shù)據(jù)庫制作的定制解決方案
端口綁定
不管是使用 docker compose,部署到 Kubernetes,還是使用 AWS、Azure 或者 GCP,應(yīng)用要想在云環(huán)境中運(yùn)行良好,就要能接受為它預(yù)設(shè)的任何端口號
總結(jié)
以上是生活随笔為你收集整理的《ASP.NET Core 微服务实战》-- 读书笔记(第7章)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core 如何判断程序是否在远
- 下一篇: abp vnext2.0核心组件之.Ne