第7章では、ASP.NET Webアプリケーションのコアを開発します
ASP.NET中核ベース
この章のケースでは、コマンドラインアプリケーションを起動し、任意のテンプレートの助けを借りずに、足場とウィザード、および最終的には完全に機能するWebアプリケーションを取得します
GitHubのリンク:https://github.com/microservices-aspnetcore/hello-world
DOTNET新しいコンソールコマンドを実行した後、我々はまず、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();
}
}
}
スタートアップクラスを追加した後、デフォルトのミドルウェアを設定するために使用され、それがすべての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パッケージを追加し、あなたがウェブ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: [email protected]<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: [email protected]<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,应用要想在云环境中运行良好,就要能接受为它预设的任何端口号
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 ([email protected]) 。