前言

简单整理一下路由和终节点。

正文

路由方式主要有两种:

1.路由模板方式

2.RouteAttribute 方式

路由约束:

1.类型约束

2.范围约束

3.正则表达式

4.是否必选

5.自定义 IRootConstaint

URL 生成

1.LinKGenerator

2.IUrlHelper

先搭建一个swagger:

services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo {Title = "API", Version = "v1"});
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory,xmlFile);
c.IncludeXmlComments(xmlPath);
});
app.UseSwagger();

app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json","My Api V1");
});

然后创建一个controller:

[Route("api/[controller]/[action]")]// RouteAttribute 的方式
[ApiController]
public class OrderController : ControllerBase
{
/// <summary>
///
/// </summary>
/// <param name="id">必须可以转为long</param>
/// <returns></returns>
[HttpGet("{id:MyRouteConstraint}")]// 这里使用了自定义的约束
public bool OrderExist(object id)
{
return true;
} /// <summary>
///
/// </summary>
/// <param name="id">最大20</param>
/// <returns></returns>
[HttpGet("{id:max(20)}")]// 这里使用了 Max 的约束
public bool Max(long id)
{
return true;
} /// <summary>
///
/// </summary>
/// <param name="ss">必填</param>
/// <returns></returns>
[HttpGet("{name:required}")]// 必填约束
public bool Reque(string name)
{
return true;
} /// <summary>
///
/// </summary>
/// <param name="number">以三个数字开始</param>
/// <returns></returns>
[HttpGet("{number:regex(^\\d{{3}}$)}")]// 正则表达式约束
public bool Number(string number)
{
return true;
}
}

看到在每个action上都有一些配置,上面就是约束。

上面这种属于RouteAttribute,故而应该设置:

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});

有了这些约束呢,我们的代码将会更加的整洁。因为我们每次获取参数的时候都应该判断是否符合规格,不符合返回404。有了这些配置我们少写很多重复性代码。

上面看到,自定义了MyRouteConstraint 约束。

public class MyRouteConstraint : IRouteConstraint
{
public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
if (RouteDirection.IncomingRequest == routeDirection)
{
var v = values[routeKey];
if (long.TryParse(v.ToString(), out var value))
{
return true;
}
}
return false;
}
}

然后在路由中加入:

services.AddRouting(options =>
{
options.ConstraintMap.Add("MyRouteConstraint", typeof(MyRouteConstraint));
});

如果显示xml找不到,加上。

 <GenerateDocumentationFile>true</GenerateDocumentationFile>

如果是显示:undefined /swagger/V1/swagger.json

一般来说,我们写过一些代码后,应该不会出现什么配置错误。

因为swagger要求比较严格,查看一下,自己写的action,上有没有标注[httpget]或者[httppost],如果没有那么可能是生成失败了。

这里显示了404,那么不应该是显示400吗? 如果是restful 风格来说,属于路由约束,一切皆资源的角度上,这个资源不存在,是应该显示404的。

下一节 简单搭建一个基础项目。

重新整理 .net core 实践篇—————路由和终结点[二十三]的更多相关文章

  1. 重新整理 .net core 实践篇————依赖注入应用[二]

    前言 这里介绍一下.net core的依赖注入框架,其中其代码原理在我的另一个整理<<重新整理 1400篇>>中已经写了,故而专门整理应用这一块. 以下只是个人整理,如有问题, ...

  2. 重新整理 .net core 实践篇—————HttpClientFactory[三十二]

    前言 简单整理一下HttpClientFactory . 正文 这个HttpFactory 主要有下面的功能: 管理内部HttpMessageHandler 的生命周期,灵活应对资源问题和DNS刷新问 ...

  3. 重新整理 .net core 实践篇—————服务的配置更新[十三]

    前言 前文讲述了,服务和配置直接的配合,这一节写一下,当配置文件修改了,每个服务如何感知自己的配置. 正文 服务感知到自己的配置发生变化,这就牵扯出两个东西: IoptionsMonitor<o ...

  4. 重新整理 .net core 实践篇—————工作单元模式[二十六]

    前言 简单整理一下工作单元模式. 正文 工作单元模式有3个特性,也算是其功能: 使用同一上下文 跟踪实体的状态 保障事务一致性 工作单元模式 主要关注事务,所以重点在事务上. 在共享层的基础建设类库中 ...

  5. 重新整理 .net core 实践篇————配置应用[一]

    前言 本来想整理到<<重新整理.net core 计1400篇>>里面去,但是后来一想,整理 .net core 实践篇 是偏于实践,故而分开. 因为是重新整理,那么就从配置开 ...

  6. 重新整理 .net core 实践篇—————文件系统[二十二]

    前言 简单介绍一下文件系统. 正文 文件系统,主要是下面3个接口组成: IFileProvider IFileInfo IDirectoryContents 那么他们的实现是: physicalFil ...

  7. 重新整理 .net core 实践篇————依赖注入应用之援军[四]

    前言 介绍第三方依赖注入框架Autofac,看看为我们解决什么问题. 下面介绍4个点: 命名注册 属性注册 aop 注入 子容器命名 正文 为什么我们需要使用第三方框架?第三方框架为我们做了什么?第三 ...

  8. 重新整理 .net core 实践篇—————服务与配置之间[十一二]

    前言 前面基本介绍了,官方对于asp .net core 设计配置和设计服务的框架的一些思路.看下服务和配置之间是如何联系的吧. 正文 服务: public interface ISelfServic ...

  9. 重新整理 .net core 实践篇—————日志系统之作用域[十七]

    前言 前面介绍了服务与日志之间的配置,那么我们服务会遇到下面的场景会被遇到一些打log的问题. 前面我提及到我们的log,其实是在一个队列里面,而我们的请求是在并发的,多个用户同时发送请求这个时候我们 ...

随机推荐

  1. MetInfo Password Reset Poisoning By Host Header Attack

    if we know some user's email, the we will can reset the user's email by host header attack. The atta ...

  2. php防注入和XSS攻击通用过滤

    public function SafeFilter($arr){ $ra=Array('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/','/script/','/javas ...

  3. Windows进程间通讯(IPC)----共享内存

    Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的. 当EXE文件第一次被加载. 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间. 系统调用 ...

  4. foreign key 多对一 多对对 一对一

    使用foreign key 要清除先有哪张表再有哪张表,后表对应前表 例如现有部门再有员工,所以员工对应部门 现有作者后有书,所以书对应作者 现有潜在顾客后有顾客,所以顾客对应潜在顾客 多对多建立3张 ...

  5. python将控制台输出保存到文件

    python将控制台输出保存到文件   在平时工作中,有时我们需要将控制台输出保存到文件 1.命令行用>覆盖写入和>>追加写入 for i in range(10000): prin ...

  6. 【转载】基于RedHatEnterpriseLinux V7(RHEL7)下SPEC CPU 2006环境搭建以及测试流程(之一)——介绍、安装准备、安装、config文件以及运行脚本介绍

    基于RedHatEnterpriseLinux V7(RHEL7)下SPEC CPU 2006环境搭建以及测试流程(之一)--介绍.安装准备.安装.config文件以及运行脚本介绍 其他 2018-0 ...

  7. 基于多端口的Web服务

    [Centos7.4版本] !!!测试环境我们首关闭防火墙和selinux [root@localhost ~]# systemctl stop firewalld [root@localhost ~ ...

  8. 云计算OpenStack核心组件---nova计算服务(7)

    一.nova介绍 Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. ...

  9. linux进阶之Tomcat服务篇

    一.Tomcat简介 Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选. Tomca ...

  10. 关于UCOSII的学习资料

    UCOSII学习资料: 在战舰的A盘资料包中 ->软件资料->ucosii 有一个叫做简易OS讲解的文档,此文从简单的OS将其,通俗易懂的讲解大体的OS运行原理,任务调度的实现过程,是入门 ...