本文首发于 码友网 –《创立 API 服务最小只有 4 行代码!!!尝新体验 ASP.NET Core 6 预览版本中公布的最小 Web API(minimal APIS)新个性》
概述
.NET 开发者们大家好,我是 Rector。
几天前(美国工夫 2021 年 8 月 10 日),微软官网公布了.NET 6 的第 7 个预览版,其中蕴含了很多新的个性和性能,比方:
- 优化最小 Web API(minimal APIS)模板
- 为生成罕用 HTTP 响应增加了 IResult 的接口实现
- 最小操作反对 Request,Response 等
- 优化了最小主机、模板
- 从查问字符串中获取 Blazor 组件参数
- …
本文咱们次要来体验最小 Web API 的性能和个性。最小 Web API 的目标次要是帮忙 C#(或者 F#)后端开发者疾速创立微服务项目或者 HTTP API 服务。
与之前的 ASP.NET Core Web API 相比,最小 Web API 在启动模板和框架结构上都有些不同。最小 Web API 的模板相当简洁,你几须要写 4 行代码便可实现一个最小 Web API 我的项目的搭建。
上面咱们从头开始创立一个最小 Web API 我的项目并体验。
筹备工作
在开始创立最小 Web API 之前,请确保开发环境中已装置了.NET SDK 6.0.100-preview.7.21379.14(以后最新的.NET SDK 版本),在 Windows 操作系统中,你能够应用.NET Cli 命令来查看,比方:
dotnet --info
运行后果如下图:
如果须要查看以后环境已装置的.NET 模板,运行如下命令:
dotnet new -l
运行后果如下:
Template Name Short Name Language Tags
-------------------------------------------- ------------------- ---------- --------------------------
ASP.NET Core Empty web [C#],F# Web/Empty
ASP.NET Core gRPC Service grpc [C#] Web/gRPC
ASP.NET Core Web API webapi [C#],F# Web/WebAPI
ASP.NET Core Web App razor,webapp [C#] Web/MVC/Razor Pages
ASP.NET Core Web App (Model-View-Controller) mvc [C#],F# Web/MVC
ASP.NET Core with Angular angular [C#] Web/MVC/SPA
ASP.NET Core with React.js react [C#] Web/MVC/SPA
ASP.NET Core with React.js and Redux reactredux [C#] Web/MVC/SPA
Blazor Server App blazorserver [C#] Web/Blazor
Blazor WebAssembly App blazorwasm [C#] Web/Blazor/WebAssembly/PWA
Class Library classlib [C#],F#,VB Common/Library
Console Application console [C#],F#,VB Common/Console
dotnet gitignore file gitignore Config
Dotnet local tool manifest file tool-manifest Config
global.json file globaljson Config
MSTest Test Project mstest [C#],F#,VB Test/MSTest
MVC ViewImports viewimports [C#] Web/ASP.NET
MVC ViewStart viewstart [C#] Web/ASP.NET
NuGet Config nugetconfig Config
NUnit 3 Test Item nunit-test [C#],F#,VB Test/NUnit
NUnit 3 Test Project nunit [C#],F#,VB Test/NUnit
Protocol Buffer File proto Web/gRPC
Razor Class Library razorclasslib [C#] Web/Razor/Library
Razor Component razorcomponent [C#] Web/ASP.NET
Razor Page page [C#] Web/ASP.NET
Solution File sln Solution
Web Config webconfig Config
Windows Forms App winforms [C#],VB Common/WinForms
Windows Forms Class Library winformslib [C#],VB Common/WinForms
Windows Forms Control Library winformscontrollib [C#],VB Common/WinForms
Worker Service worker [C#],F# Common/Worker/Web
WPF Application wpf [C#],VB Common/WPF
WPF Class library wpflib [C#],VB Common/WPF
WPF Custom Control Library wpfcustomcontrollib [C#],VB Common/WPF
WPF User Control Library wpfusercontrollib [C#],VB Common/WPF
xUnit Test Project xunit [C#],F#,VB Test/xUnit
创立最小 API 程序我的项目
在.NET Core 中创立程序的形式有多种,能够应用命令行工具执行 dotnet new < 模板名称 > < 项目名称 >
创立,也能够应用 IDE(如:Visual Studio, Rider, VS Code)来创立。
应用命令行工具创立最小 API 我的项目
在本地磁盘创立一个存储我的项目的目录,如果门路为D:\Project\tmp\MinimalApi
,关上命令行工具并进入此目录,在当前目录下执行如下命令:
dotnet new web MinApi
执行后果如下图
生成的我的项目文件夹和文件如下图
至此,以命令行形式创立最小 API 我的项目即实现。
应用 Visual Studio 创立最小 API 我的项目
应用 Visual Studio 创立最小 API 我的项目,请确保已装置 Visual Studio 2022 17.0.0 Preview 3.0(以后最新版本)。
顺次关上 Visual Studio 2022 的【Start Window】->【Create a new project】窗口,在右侧的已装置模板列表中抉择【ASP.NET Core Empty】我的项目模板,之后点击 [Next] 按钮,如图:
在弹出的【Configure your new project】中,欠缺 Project name(项目名称),Location(地位),Solution name(解决方案名称)等信息,而后点击 [Next] 按钮,如图:
在弹出的【Additional Information】窗口中,Framework 的版本抉择 [.NET 6.0(Preview)],而后点击[Next] 按钮,以实现最小 API 我的项目的创立,如图:
最小 API 解析
在 IDE 中关上方才创立的 MinimalApi,并在代码编辑器中关上 Program.cs
文件,如下:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
if (app.Environment.IsDevelopment())
{app.UseDeveloperExceptionPage();
}
app.MapGet("/", () => "Hello World!");
app.Run();
能够看到,最小 API 我的项目的代码十分简洁,如果去掉其中的异样解决代码,就还剩 4 行代码了,如下:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
为了不启用 https,咱们批改一下位于 Properties
目录中的 launchSettings.json
配置文件,批改后如下:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:2200",
"sslPort": 0
}
},
"profiles": {
"MinimalApi": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:2200",
"environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}
}
}
}
而后启用我的项目,看是否能失常运行起来。在 Visual Studio 2022 中,按 F5 运行,如果在浏览中关上并显示如下页面,阐明最小 API 我的项目运行失常,如图:
在最小 API 我的项目中,间接调用 WebApplication.MapGet()
办法即可实现路由的注册和映射,如新增一个 error
的路由:
app.MapGet("/error", () => Results.Problem("谬误",statusCode:500));
运行后果如图:
WebApplication
实例提供了很多路由映射的办法,比方 HTTP 申请协定:MapGet()
,MapPost()
,MapDelete()
,MapPut()
等等。
与以往的 ASP.NET Core 应用程序雷同,在最小 API 我的项目中,你依然能够应用像 Swagger 这样的接口文档组件。
首先,在 Nuget 包管理工具中搜寻 Swashbuckle
,而后装置Swashbuckle.AspNetCore
组件,如图:
而后注册 Swagger 的服务和路由,残缺的示例如下:
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args);
/// <summary>
/// 增加 Swagger
/// </summary>
builder.Services.AddSwaggerGen(c =>
{c.SwaggerDoc("v1", new OpenApiInfo { Title = "Api", Version = "v1"});
});
/// <summary>
/// 注册 API 发现性能
/// </summary>
builder.Services.AddEndpointsApiExplorer();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{app.UseDeveloperExceptionPage();
}
app.MapGet("/", () => "Hello World!");
/// <summary>
/// 抛出异样测试
/// </summary>
app.MapGet("/throw", () => {throw new Exception("Exception occured"); });
/// <summary>
/// 谬误页面示例
/// </summary>
app.MapGet("/error", () => Results.Problem("谬误",statusCode:500));
/// <summary>
/// 注册 Swagger 的路由
/// </summary>
app.UseSwagger();
/// <summary>
/// 注册 Swagger UI 的路由
/// </summary>
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Api v1"));
app.Run();
运行后的 Swagger 界面如图:
在最小 API 应用程序中,咱们同样也能够返回实体对象,比方:注册一个 /customer
的路由,而后返回一个 Customer
的实例模型,如下:
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args);
/// <summary>
/// 增加 Swagger
/// </summary>
builder.Services.AddSwaggerGen(c =>
{c.SwaggerDoc("v1", new OpenApiInfo { Title = "Api", Version = "v1"});
});
/// <summary>
/// 注册 API 发现性能
/// </summary>
builder.Services.AddEndpointsApiExplorer();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{app.UseDeveloperExceptionPage();
}
app.MapGet("/", () => "Hello World!");
/// <summary>
/// 抛出异样测试
/// </summary>
app.MapGet("/throw", () => {throw new Exception("Exception occured"); });
/// <summary>
/// 谬误页面示例
/// </summary>
app.MapGet("/error", () => Results.Problem("谬误",statusCode:500));
/// <summary>
/// 返回客户实体模型
/// </summary>
app.MapGet("/customer", () => new Customer("Rector", "Liu"));
/// <summary>
/// 注册 Swagger 的路由
/// </summary>
app.UseSwagger();
/// <summary>
/// 注册 Swagger UI 的路由
/// </summary>
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Api v1"));
app.Run();
/// <summary>
/// 客户实体
/// </summary>
/// <param name="FirstName"></param>
/// <param name="LastName"></param>
public record Customer(string FirstName, string LastName);
运行后果如图:
好了,本文对最小 Web API 的体验到此。码友网将在后续的文章中为大家分享的对于最小 Web API 的其余性能和个性,敬请关注。