.Net Minimal Api 介绍
Minimal API是.Net 6中新增的模板,借助C# 10的一些特性以最少的代码运行一个Web服务。本文脱离VS通过VS Code,完成一个简单的Minimal Api项目的开发。
创建项目
随便新建一个文件夹,用来管理我们的项目文件,文件夹内启动命令行,通过`dotnet new web`创建项目。

还是一堆文件,什么时候一个Program.cs文件就能跑起一个Web项目没准哪天也可以了
运行项目
项目目录下执行`dotnet run`,运行项目。

尝试玩点花的用网页版VS Code (https://vscode.dev/)运行项目,不过并没有我想象中那么强,还不支持。
Coding
builder实例提供了Services属性,可以完成原本Startup类ConfigureServices方法中注册服务的工作,Configure方法的一些Use操作则通过app来完成。
builder.Services.AddMemoryCache();
//todo
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", $"{builder.Environment.ApplicationName} v1"));
}
MapGet变种
通过Build出来的app实例的MapGet方法实现路由的映射。
app.MapGet("/", () => "Hello World!");
//app.Map("/",[HttpGet] () => "Hello World!");
//app.MapMethods("/", new List<string>() { HttpMethod.Get.ToString() }, () => "Hello World!");
可以看到通过Delegate的方式可以直接在Delegate前加上对应的特性。async关键字同样可以直接标记在Delegate前。
路由映射感觉还差点意思。不能像其它语言框架一样进行不同版本的管理,如:
var api = app.Part("v1",middleware);
api.MapGet("", () =>{ return ""; });
Application
代码内直接修改应用程序配置,如修改监听端口
app.Urls.Add("http://localhost:3000");
//app.Urls.Add("http://localhost:4000");
//app.Run();
app.Run("http://localhost:4000");
优先级 app.Run > app.Urls.Add > launchSettings
Dependency Injection
Minimal API中无法使用构造函数注入,可以通过参数方式注入,可以忽略掉FromServices特性的标记。

Context
一些Http请求的上下文信息也可以通过参数直接指定,方法体内直接使用,代替MVC中的Request等。如:
HttpContextHttpRequestHttpResponseClaimsPrincipalCancellationToken
app.MapGet("/context", (HttpContext httpContext) => new
{
Data = httpContext.Connection.Id
});
更多类型参考:github
Responses
通过静态类Results返回标准的相应类型,实现和ControllerBase提供对应方法相同的效果。
app.MapGet("/ok/{id}", (int id) =>
{
return Results.Ok($"ok:{id}");
});
Link Generation
通过扩展方法WithXXX等可以对路由进行一些配置,如通过WithName指定名称,再通过LinkGenerator生产对应Uri,避免硬编码
app.MapGet("/context", (HttpContext httpContext) => new
{
Data = httpContext.Connection.Id
}).WithName("hi");
app.MapGet("hello", (LinkGenerator linker) =>
$"The link to the hello route is {linker.GetPathByName("hi", values: null)}");
除了WithXXX等一些列RoutingEndpointConvention扩展方法外,还提供了AuthorizationEndpointConvention相关扩展方法RequireAuthorization、AllowAnonymous代替MVC模式中的相关特性(特性也还可以用只是多了一个支持方式)。
本文只列出Minimal API的一些简单用法,集成Swagger等用法内容参考:https://minimal-apis.github.io/hello-minimal/
接口的返回状态码和类型等可以通过扩展方法Produces说明,如:Produces<ResponseMode>(contentType:"application/xml"); ,但是接口备注貌似还不支持,我尝试了很多方式都不能正确显示。
Code Format
Minimal API上面示例存在的问题是Program文件中会有太多的编码,所有路由的映射和响应都在一起,虽然可以通过如下方式使用静态方法抽离响应方法,但所有的Route Map还是列在一起,不能像Controller一下分离。
var handler = new HelloHandler();
app.MapGet("/", handler.Hello);
class HelloHandler
{
public string Hello()
{
return "Hello World";
}
}
可以借助开源框架MASA.Contrib提供的MASA.Contrib.Service.MinimalAPIs完成代码封装。
详细用法参考MASA.EShop

.Net Minimal Api 介绍的更多相关文章
- 简单聊下.NET6 Minimal API的使用方式
前言 随着.Net6的发布,微软也改进了对之前ASP.NET Core构建方式,使用了新的Minimal API模式.之前默认的方式是需要在Startup中注册IOC和中间件相关,但是在Minimal ...
- 常用ArcGIS for Silverlight 开发API介绍
1.API介绍 2.Map对象 3.Layer对象 4.Symbol对象 5.Task对象
- Servlet基础(一) Servlet简介 关键API介绍及结合源码讲解
Servlet基础(一) Servlet基础和关键的API介绍 Servlet简介 Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中. Servlet容器负责Servl ...
- python学习笔记(win32print API介绍)
最近博主在研究用python控制打印机 这里整理下win32print的API介绍,官网地址http://timgolden.me.uk/pywin32-docs/win32print.html Op ...
- 使用html5中video自定义播放器必备知识点总结以及JS全屏API介绍
一.video的js知识点: controls(控制器).autoplay(自动播放).loop(循环)==video默认的: 自定义播放器中一些JS中提供的方法和属性的记录: 1.play()控制视 ...
- Commons-lang API介绍
4.1 Commons-lang API介绍 4.1.1 StringUtils 4.1.2 StringEscapeUtils 4.1.3 ArrayUtils 4.1.4 DateUtils 4. ...
- APP自动化框架LazyAndroid使用手册(3)--核心API介绍
作者:黄书力 概述 在前一篇博文中,简要介绍了一款安卓UI自动化测试框架LazyAndroid (http://blog.csdn.net/kaka1121/article/details/53204 ...
- Spring Boot 2.x 编写 RESTful API (一) RESTful API 介绍 & RestController
用Spring Boot编写RESTful API 学习笔记 RESTful API 介绍 REST 是 Representational State Transfer 的缩写 所有的东西都是资源,所 ...
- FastDFS api介绍
1. 命令行api介绍 FastDFS提供了可用于运维测试的命令行api,下面进行介绍: 1.1 fastdfs服务管理 tracker进程服务管理脚本 /etc/init.d/fdfs_tracke ...
随机推荐
- Linux系列(1) - 使用Hyper-V安装Linux系统
前言 使用工具:Hyper-V,补充:hyper-v是一项技术,而vmware是一款软件.具体区别自行百度 LINUX版本:CentOS-8.4.2105-x86_64-dvd1.iso Window ...
- css宽度+字体+颜色+边框+文本+光标+伪类选择器
常用属性: width:宽 height:高 min-width:最小宽度 :可以设置如果宽度变小了,有个滑动效果(常常在我们布局的过程中需要去设置) min-height;最小高度 max-widt ...
- linux 上添加多个jdk
1. 首先将你需要上传的jdk 上传并解压 2.你可以自定义解压的路径 3. alternatives --install /usr/bin/java java /usr/java/jdk1.7.0_ ...
- sublime text 3 在Windows下配置sublimelinter-php的路径问题
首先用package control安装sublimelinter和sublimelinter-php,然后依次点击菜单preference-package settings-sublimelinte ...
- Win10删除电脑3D对象等7个文件夹
把下面几个注册表项依次删除掉 "图片"文件夹:[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Expl ...
- Dapr + .NET Core实战(六)绑定
什么是绑定 处理外部事件或调用外部接口的功能就是绑定,绑定可以提供以下好处: 避免连接到消息系统 ( 如队列和消息总线 ) 并进行轮询的复杂性 聚焦于业务逻辑,而不是如何与系统交互 使代码不受 SDK ...
- CEF使用过程问题合集
CEF使用过程问题合集 1.Couldn't mmap icu data file 解决方案:检查程序执行目录下是否有icudtl.dat文件,如果没有请从cef的Resources文件夹中复制一份. ...
- 洛谷3783 SDOI2017 天才黑客(最短路+虚树+边转点+线段树优化建图)
成功又一次自闭了 怕不是猪国杀之后最自闭的一次 一看到最短路径. 我们就能推测这应该是个最短路题 现在考虑怎么建图 根据题目的意思,我们可以发现,在本题中,边与边之间存在一些转换关系,但是点与点之间并 ...
- 洛谷4219 BJOI2014大融合(LCT维护子树信息)
QWQ 这个题目是LCT维护子树信息的经典应用 根据题目信息来看,对于一个这条边的两个端点各自的\(size\)乘起来,不过这个应该算呢? 我们可以考虑在LCT上多维护一个\(xv[i]\)表示\(i ...
- FastAPI 学习之路(九)请求体有多个参数如何处理?
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
