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
 app.UseStaticFiles();
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等。如:

  • HttpContext
  • HttpRequest
  • HttpResponse
  • ClaimsPrincipal
  • CancellationToken
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 介绍的更多相关文章

  1. 简单聊下.NET6 Minimal API的使用方式

    前言 随着.Net6的发布,微软也改进了对之前ASP.NET Core构建方式,使用了新的Minimal API模式.之前默认的方式是需要在Startup中注册IOC和中间件相关,但是在Minimal ...

  2. 常用ArcGIS for Silverlight 开发API介绍

    1.API介绍 2.Map对象  3.Layer对象 4.Symbol对象 5.Task对象

  3. Servlet基础(一) Servlet简介 关键API介绍及结合源码讲解

    Servlet基础(一) Servlet基础和关键的API介绍 Servlet简介 Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中. Servlet容器负责Servl ...

  4. python学习笔记(win32print API介绍)

    最近博主在研究用python控制打印机 这里整理下win32print的API介绍,官网地址http://timgolden.me.uk/pywin32-docs/win32print.html Op ...

  5. 使用html5中video自定义播放器必备知识点总结以及JS全屏API介绍

    一.video的js知识点: controls(控制器).autoplay(自动播放).loop(循环)==video默认的: 自定义播放器中一些JS中提供的方法和属性的记录: 1.play()控制视 ...

  6. 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. ...

  7. APP自动化框架LazyAndroid使用手册(3)--核心API介绍

    作者:黄书力 概述 在前一篇博文中,简要介绍了一款安卓UI自动化测试框架LazyAndroid (http://blog.csdn.net/kaka1121/article/details/53204 ...

  8. Spring Boot 2.x 编写 RESTful API (一) RESTful API 介绍 & RestController

    用Spring Boot编写RESTful API 学习笔记 RESTful API 介绍 REST 是 Representational State Transfer 的缩写 所有的东西都是资源,所 ...

  9. FastDFS api介绍

    1. 命令行api介绍 FastDFS提供了可用于运维测试的命令行api,下面进行介绍: 1.1 fastdfs服务管理 tracker进程服务管理脚本 /etc/init.d/fdfs_tracke ...

随机推荐

  1. 【PHP】保留两位小数并向上取整

    问题: 一开始我想着数值*100然后向上取整然后再除以一百 $num = 1000 * 0.9634; echo $num; echo '</br>'; $res = ceil($num ...

  2. C# Redis学习系列二:Redis基本设置

    上一篇:C# Redis学习系列一:Redis的认识.下载.安装.使用 一.redis 设置密码 使用下载好的 redis-cli.exe 指令: 1.设置密码: config set require ...

  3. DEDE留言板调用导航的方法

    DEDE留言板调用导航的方法 dede里的留言板guestbook.htm用{dede:include filename="../default/head.htm"/}不能自动生成 ...

  4. Java基础系列(40)- Arrays类

    Arrays类 数据的工具类java.util.Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作 查看 ...

  5. 3. Go并发编程--数据竞争

    目录 1.前言 2.数据竞争 2.1 示例一 2.1.1 测试 2.1.2 data race 检测 2.1.3 data race 配置 2.2 循环中使用goroutine引用临时变量 2.3 引 ...

  6. centos7安装sonarqube与使用

    https://www.cnblogs.com/mascot1/p/11179767.html https://blog.csdn.net/superbfly/article/details/1039 ...

  7. PHP 一个树为另一棵树的子结构 [TO BE CONTINUED]

    输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) <?php class TreeNode { private $val; private $left; ...

  8. 『Python』matplotlib划分画布的主要函数

    1. subplot() 绘制网格区域中几何形状相同的子区布局 函数签名有两种: subplot(numRows, numCols, plotNum) subplot(CRN) 都是整数,意思是将画布 ...

  9. c++ 的学习笔记 第一集cim cout

    1. 你要用这个东西,所以得有包含它得头文件,就像java 你要用某个模块,你得包含这个模块 模块化??单片机里面学的模块化(可以在vs里面实现) 2. 当我把注册表regedit 程序删除之后成功了 ...

  10. NOIP 模拟二 考试总结

    SDOI2015 排序 今天看到这道题,没有一点思路,暴力都没的打...还是理解错题意了,操作不同位置不是说改不同的区间,而是不同操作的顺序...考场上如果知道这个的话最少暴力拿一半啊,因为正解本来就 ...