《ASP.NET Core 微服务实战》-- 读书笔记(第7章)
第 7 章 开发 ASP.NET Core Web 应用
ASP.NET Core 基础
在本章,我们将从一个命令行应用开始,并且在不借助任何模板,脚手架和向导的情况下,最终得到一个功能完整的 Web 应用
GitHub链接:https://github.com/microservices-aspnetcore/hello-world
运行 dotnet new console 命令之后,我们首先得到一个 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();}}
}
之后添加一个 Startup 类,用于配置默认的中间件,它对所有 HTTP 请求都返回 "Hello World" 响应
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 包作为项目的依赖,并直接在项目文件开头处声明要使用的 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
添加控制器
控制器专门负责:
(1)接收来自 HTTP 请求的输入
(2)将输入转交给与 HTTP 通信、JSON解析无关的服务类处理
(3)返回合适的响应代码及正文
using Microsoft.AspNetCore.Mvc;
namespace StatlerWaldorfCorp.WebApp.Controllers
{public class HomeController : Controller{public IActionResult Index(){return "Hello World";}}
}
只要向文件中加入上面的内容,此前创建的路由就能自动检测到这个控制器并让它生效
添加模型
我们创建了一个用于表示股票报价的简单模型
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>
现在,我们可用修改 HomeController,不再返回示例文本,而是呈现视图
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);}}
}
如果现在运行应用,很可能会收到 HTTP 500 响应
由于我们开发的是 Web 应用,因而一定希望能查看所有发生错误的堆栈信息
可用向 Startup 类的 Configure 方法中加入一行调用 UseDeveloperExceptionPage 的代码,实现这一需求
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 类,我们应该能够通过 dotnet restore 以及 dotnet run 启动应用
从 JavaScript 中调用 REST API
首先,我们通过添加新的控制器来创建 API 端点
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 });}}
}
如果现在再运行应用,可用打开浏览器并访问 http://localhost:5000/api/test,应该能看到一个 JSON 响应
{"symbol" : "API","price" : 9999
}
有了可供消费的 API 后,现在来修改我们唯一的视图,让它调用 JavaScript 来消费这个 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>
注意,这里决定引入一个 jQuery,以及一个新脚本 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 端点发送 Ajax 请求,返回的对象会包含 symbol 和 price 属性,它们将被附加到新添加的段落标签之中
开发云原生 Web 应用
(1)API 优先
(2)配置
(3)日志
(4)会话状态
(5)数据保护
(6)后端服务
(7)环境均等
(8)端口绑定
(9)遥测
(10)身份验证和授权
会话状态
云原生 Web 应用基本上不可能再使用基于内存的会话状态了,而必须使用进程外的提供程序
数据保户
如果涉及数据保护,”进程外存储“的思路同样适用于密钥存储
我们要使用一种现成的密钥保管库,可以是基于云的密钥保管库,也可以是基于 Redis 或其他数据库制作的定制解决方案
端口绑定
不管是使用 docker compose,部署到 Kubernetes,还是使用 AWS、Azure 或者 GCP,应用要想在云环境中运行良好,就要能接受为它预设的任何端口号
《ASP.NET Core 微服务实战》-- 读书笔记(第7章)相关推荐
- 《ASP.NET Core 微服务实战》译者序
最近,我将<ASP.NET Core 微服务实战>一书由英文翻译为中文.这本书是由清华大学出版社引进的,目前还处于最后的排版校对过程中,现将该书的译者序发表于此. 以下为译者译全文: &q ...
- 《ASP.NET Core 微服务实战》送书结果公告
如何构建基于.NET Core和云环境下的微服务技术体系?的送书抽奖结果已经出来了: 当前只有一位同学填写了地址.其他几位同学抓紧填写,3/9 日还没有完成填写将作废,奖品可是热门的<ASP.N ...
- 《ASP.NET Core 微服务实战》-- 读书笔记(第10章)
第 10 章 应用和微服务安全 云应用意味着应用运行所在的基础设施无法掌控,因此安全不能再等到事后再考虑,也不能只是检查清单上毫无意义的复选框 由于安全与云原生应用密切相关,本章将讨论安全话题,并用示 ...
- 《ASP.NET Core 微服务实战》-- 读书笔记(第3章)
第 3 章 使用 ASP.NET Core 开发微服务 微服务定义 微服务是一个支持特定业务场景的独立部署单元.它借助语义化版本管理.定义良好的 API 与其他后端服务交互.它的天然特点就是严格遵守单 ...
- 《ASP.NET Core 微服务实战》-- 读书笔记(第1章 、第2章)
译者序 微服务设计方法清晰定义了各个开发团队的业务边界,微服务框架以不同方式实现了服务之间的协作与集成. .NET Core 作为全新的 .NET 技术,它不仅完全开源.跨平台,更面向云原生开发进行了 ...
- 《ASP.NET Core 微服务实战》-- 读书笔记(第9章)
第 9 章 微服务系统的配置 微服务系统中的配置需要关注更多其他方面的因素,包括: 配置值的安全读写 值变更的审计能力 配置信息源本身的韧性和可靠性 少量的环境变量难以承载大型.复杂的配置信息 应用要 ...
- 《ASP.NET Core 微服务实战》-- 读书笔记(第12章)
第 12 章 设计汇总 微服务开发并不是要学习 C#.Java 或者 Go 编程--而是要学习如何开发应用以适应并充分利用弹性伸缩环境的优势,它们对托管环境没有偏好,并能瞬间启停 换句话说,我们要学习 ...
- 《ASP.NET Core 微服务实战》-- 读书笔记(第11章)
第 11 章 开发实时应用和服务 在本章,我们将讨论"实时"的准确含义,以及在大部分消费者看来应该属于这一范畴的应用类型 接着,我们将探讨 WebSocket,并分析为什么传统的 ...
- 《ASP.NET Core 微服务实战》-- 读书笔记(第6章)
第 6 章 事件溯源与 CQRS 在本章,我们来了解一下随着云平台一同出现的设计模式 我们先探讨事件溯源和命令查询职责分离(CQRS)背后的动机与哲学 事件溯源简介 事实由事件溯源而来 我们大脑就是一 ...
最新文章
- linux用户及权限
- 国航移动门户让我出行无忧
- 3DSlicer12:风格准则
- 为什么ABAP整型的1转成string之后,后面会多个空格
- 数据库-查看数据库-创建数数据库
- alv 刷新_钜献 | 60小时刷新你的雅思托福成绩!明早9点我们要搞事情了!
- centos mysql 新增用户
- BZOJ1857:[SCOI2010]传送带——题解
- 使用ceph-deploy搭建三节点ceph集群
- [转载]学习java30条基本的概念
- php 把java list对象转成数组,java_JSON的String字符串与Java的List列表对象的相互转换,在前端:
1.如果json是List对象 - phpStudy...
- 办信用卡被拒绝是什么原因?
- 【目标检测】Labelme的改进——海量图片的自动标注
- Webpack常用插件总结
- RISC和CISC的比较VLIW、EPIC
- Spoken English-口语-发音规则
- 深度学习中关于 “深度” 的理解
- OBS开源免费桌面视频直播工具/直播推流工具使用指南
- Altium 在PCB重新编号更新到SCH原理图的方法
- Markdown (CSDN) MD编辑器(三)- 图片缩放、指定尺寸、居中、左对齐、右对齐
热门文章
- Xcode6.1 模拟器路径
- mongoDB 高级查询之取模查询$mod
- 为operamasks增加HTML扩展方式的组件调用
- 在Marketplace上销售应用【WP7学习札记之十八】
- python图片内容长度识别_Python实现识别图片内容的方法分析
- Stay Hungry Stay Foolish——网络学习平台分享
- 视频造假_如何发现“深造假”面部切换视频
- wpf office 菜单_如何带回Office 2007中的旧菜单
- hibernate自定义校验器使用(字段在in范围之内)
- Java基础- super 和 this 解析