《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,应用要想在云环境中运行良好,就要能接受为它预设的任何端口号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git为私有仓库设置密码_dnf仓库密码设置不跳出 dnf仓库密码设置流程

部分玩家想要设置游戏中仓库密码但是自己不小心点击了不再提醒后不再弹出了&#xff0c;那么怎么办呢&#xff0c;其实不用着急&#xff0c;下面带大家了解一下如何设置设置仓库锁密码&#xff0c;感兴趣的玩家可以玩下看看哦。dnf仓库密码设置不跳出在游戏中玩家每天第一次登陆…

word List 07

word List 07 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

TIOBE 2月编程语言排行榜新鲜出炉!C# 获3.08%增长率!

编程C# 刚经历了一次TIOBE考试&#xff0c;2020年2月&#xff0c;它拿到的最新分数是第5名。老牌编程语言Java独占鳌头&#xff0c;C语言紧随其后。诚然&#xff0c;工程师们对C# 的青睐&#xff0c;还没能影响到大多数企业&#xff0c;但增长率3.08%的势头&#xff0c;可凭此预…

自动生成sqlserver增删改成_如何批量生成证书证件-可变条码-可变图片-可变数据-快速教程...

如何生成可变图像&#xff1f;如何生成可变文本&#xff1f;如何生成可变条码&#xff1f;如何使打印作业自动化&#xff1f;从多页设计中选取页使用几乎所有数据库程序中的数据库信息通过“拖放”创建个性化打印分享快速教程。1&#xff1a;批量自动化化印刷详细步骤如下&…

线性代数---矩阵的各种问题求解方法

线性代数—矩阵的各种问题求解方法 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

ERP开放平台定制化远程高效协作秘笈

疫情期间&#xff0c;远程研发协作办公成为各企业的主要工作方式&#xff0c;本文将明源云以往的研发实践&#xff0c;结合本次远程办公的实际经验&#xff0c;分享一下面对跨地区多团队&#xff0c;如何高效在线协同&#xff0c;保证研发质量与效率的实践经验。面对当前严重的…

[蓝桥杯2017初赛]跳蚱蜢-map标记+bfs+环形数组

解题思路&#xff1a; 这题如果我们考虑蚱蜢跳&#xff0c;有很多蚱蜢&#xff0c;有很多情况&#xff0c;所以我们让空盘跳&#xff0c;这样就简化题目了&#xff0c;然后我们化圆为直&#xff0c;将题目的情况看成字符串012345678&#xff0c;最后要变成087654321&#xff0c…

win10玩cf不能全屏_如何优化Win10游戏流畅运行?Win10游戏流畅运行优化教程

很多小伙伴们在安装了win10操作系统之后&#xff0c;运行游戏的过程中可能就会遇到游戏卡顿不流畅的情况。如何优化Win10游戏流畅运行&#xff1f;在这里小编为大家准备了一些解决游戏卡顿的小妙招&#xff0c;一起看下吧~如何优化Win10游戏流畅运行一. 关闭nagle算法很多人对于…

数据结构---邻接表的DFS

数据结构—邻接表的DFS 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #define typeNode int //每个头结点的标识数据类型 #define N 100 //最大结点数 int degree[N]; int result[N]; bool visited[N]; typedef str…

简化MVVM属性设置和修改 - .NET CORE(C#) WPF开发

阅读导航常用类属性设置、获取方式二次封装 INotifyPropertyChangedDemo 展示、源码下载1. 常用类属性设置、获取方式public class Student : INotifyPropertyChanged {private string name;public string Name{get { return name; }set{if(name ! value){name value;OnProper…

李洪超 硬件工程师_西安职位|各类工程师,软件开发等多岗位招募,轻松月入过万,全程视频面试...

点击上方蓝字关注我们西安卓华联盛科技有限公司公司简介&#xff1a; 深圳市卓翼科技股份有限公司(以下简称“卓翼科技”)创始于2004年&#xff0c;2010年3月在深交所挂牌上市(证券代码&#xff1a;002369)。卓翼科技专业从事通讯、计算机、消费类电子等产品的研发、制造与销售…

word List 08

word List 08 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

云原生 - Istio可观察性之分布式跟踪(三)

作者&#xff1a;justmine头条号&#xff1a;大数据与云原生微信公众号&#xff1a;大数据与云原生创作不易&#xff0c;在满足创作共用版权协议的基础上可以转载&#xff0c;但请以超链接形式注明出处。为了方便阅读&#xff0c;微信公众号已按分类排版&#xff0c;后续的文章…

[蓝桥杯2017初赛]算式900+dfs,next_permutation

法一: 代码如下&#xff1a; #include <iostream> using namespace std; const int N 15; bool st[N]; int a[N];void dfs(int u) {if (u 11) {if ((((a[1] * 1000 a[2] * 100 a[3] * 10 a[4]) - (a[5] * 1000 a[6] * 100 a[7] * 10 a[8])) * (a[9] *10 a[10])…

electron ant-design-vue 不能用_基于 Electron 桌面消息管理客户端iGot

今天给小伙伴们分享一个超棒的Electron聚合消息管理器Electron-iGot。electron-igot 一款汇聚微信、邮箱、App消息推送的桌面管理客户端。支持推送消息实时提醒及管理。用途用于短信转发&#xff1b;服务器进程监听、内存/CPU预警监测&#xff1b;项目业务的提醒&#xff1b;..…

数据结构---邻接矩阵的BFS

数据结构—邻接矩阵的BFS 原理&#xff1a;参考趣学数据结构 代码&#xff1a; 队列代码&#xff1a; #pragma once #define elemType int #define N 100 #include<stdlib.h> typedef struct dQueue {int data;struct dQueue* next; }dQueue; typedef struct queue {d…

WTM系列视频教程:CodeFirst

WTM系列视频教程第二章&#xff1a;CodeFirst文字摘要&#xff1a;“群里好多人质疑我啊&#xff0c;说你刚40&#xff0c;哪来的30年开发经验。我解释一下啊&#xff0c;我是8岁开始接触编程&#xff0c;学习的第一个语言是basic&#xff0c;用的苹果电脑&#xff0c;不是你们…

总结定时器设计方法_钢结构刚性固定钢柱脚设计方法总结,看完不仅懂操作,还懂了原理...

一、钢柱柱脚形式的分类刚性固定柱脚&#xff1a;1)埋入式柱脚&#xff1b;2)外包式柱脚&#xff1b;3)插入式柱脚&#xff1b;铰接柱脚&#xff1a;外露式柱脚&#xff1b;二、埋入式柱脚2.1、基本概念&#xff1a;所谓埋入式柱脚是指将钢柱底端直接埋入混凝土基础筏板、地基梁…

数据结构---邻接表的BFS

数据结构—邻接表的BFS 原理&#xff1a;参考趣学数据结构 代码&#xff1a; 队列代码&#xff1a; #pragma once #define elemType int #define N 100 #include<stdlib.h> typedef struct dQueue {int data;struct dQueue* next; }dQueue; typedef struct queue {dQu…

华硕主板开机只进入Bios模式不进入Windows系统

华硕电脑进入bios界面解决办法 1.可以按平常方法多重启几下&#xff08;bios界面按f10确认保存&#xff09; 2.是固态硬盘的地方看看是否有松动 插回去就可以了3.图形界面bios先按f7进入高级模式&#xff0c;【security】菜单&#xff0c;通过方向键选择【secure Boot】选项&am…