重新整理.netcore实践篇—————路由和终结点[二十三](代码片段)

你永远想象不到,一个光鲜亮丽的Application,有多么 你永远想象不到,一个光鲜亮丽的Application,有多么肮脏的Code     2022-11-30     219

关键词:

前言

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

正文

路由方式主要有两种:

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(^\\\\d3$)")]// 正则表达式约束
	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的。

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

重新整理.netcore实践篇—————应用层[三十](代码片段)

前言简单介绍一下应用层。正文应用层用来做什么的呢?应用层用来做处理api请求的。[HttpPost]publicTask<long>CreateOrder([FromBody]CreateOrderVeiwModelviewModel) varmodel=viewModel.ToModel(); returnawaitorderService.CreateOrder(model); 查看详情

重新整理.netcore实践篇—————工作单元模式[二十六](代码片段)

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

重新整理.netcore实践篇—————静态中间件[二十一](代码片段)

前言简单整理一下静态中间件。正文我们使用静态文件调用:app.UseStaticFiles();那么这个默认会将我们根目录下的wwwroot作为静态目录。这个就比较值得注意的,可能刚开始学.netcore的小伙伴,会直接把脚本写在更目录script这样是访... 查看详情

重新整理.netcore实践篇—————仓储层的具体实现[二十七](代码片段)

前言简单整理一下仓储层。正文在共享层的基础建设类库中:///<summary>///泛型仓储接口///</summary>///<typeparamname="TEntity">实体类型</typeparam>publicinterfaceIRepository<TEntity>whereTEntity:Entity,IAggregate 查看详情

重新整理.netcore实践篇—————应用分层[二十四](代码片段)

前言简单整理一下分层。正文应用程序分层,分为:1.领域模型层2.基础设施层3.应用层4.共享层共享层共享层一般包括下面几个类库。有一个Core的类库,比如说BLog.Core.这个类库用来,主要用来承载一些基础简单的类型,比如说一... 查看详情

重新整理.netcore实践篇—————entity的定义[二十五](代码片段)

前言简单介绍一下实体模型的设计。正文前文提及了我们的应用分为:共享层基础设施层领域层应用层今天来介绍领域模型层。前文提及到领域模型在共享层有一个领域模型抽象类库。里面有这些类:先分别介绍一下这些类是做... 查看详情

重新整理.netcore实践篇—————微服务的桥梁eventbus[三十一](代码片段)

前言简单介绍一下EventBus.正文EventBus也就是集成事件,用于服务与服务之间的通信。比如说我们的订单处理事件,当订单处理完毕后,我们如果通过api马上去调用后续接口。比如说订单完成给用户通知的话,如果是大量订单,即... 查看详情

重新整理.netcore实践篇—————日志系统之结构化[十八](代码片段)

前言什么是结构化呢?结构化,就是将原本没有规律的东西进行有规律话。就比如我们学习数据结构,需要学习排序然后又要学习查询,说白了这就是一套,没有排序,谈如何查询是没有意义的,因为查询算法就是根据某种规律... 查看详情

重新整理.netcore实践篇—linux上排查问题实用工具[外篇]

前言介绍下面几个工具:Lldbcreatedumpdotnet-dumpdotnet-gcdumpdotnet-symbolProcdump该文的前置篇为:https://www.cnblogs.com/aoximin/p/16839812.html献给初学者,这篇就只介绍下看下日志和lldb,毕竟东西太多了。正文我以官网的例子作为演示:... 查看详情

asp.netcore中间件应用实践中你不知道的那些事(代码片段)

...工作原理的同学,可以点击查看以下两篇解读文章:Asp.NetCoreEndPoint终结点路由工作原理解读ASP.NETCORE管道模型及中间件使用解读1.1中间件(Middleware)的作用我们知道,任何的一个web框架都是把http请求封装成一个管道,每一次的请... 查看详情

asp.netcore6框架揭秘实例演示[30]:利用路由开发restapi

借助路由系统提供的请求URL模式与对应终结点之间的映射关系,我们可以将具有相同URL模式的请求分发给与之匹配的终结点进行处理。ASP.NET的路由是通过EndpointRoutingMiddleware和EndpointMiddleware这两个中间件协作完成的,它们... 查看详情

istio实践-路由控制及多应用部署(netcore&springboot)

...接上一篇istio应用部署及服务间调用,本文介绍通过构建.netcore与springboot简单服务应用,实现服务间调用及相关路由控制等1、.netcore代码介绍及应用部署新建.netcorewebapi服务项目,添加简单服务调用方法(getStrByServiceName与getS 查看详情

.netcore杂记

...解了.netcore设计理念和设计思想(纯属跟人理解)。再此整理了之前写的一些学习笔记,后续也会把新的学习新的加上。1..netcore跨平台实践2.asp.netcore使用EF7CodeFirst创建数据库,同时使用命令创建数据库 查看详情

.netcore实践篇————网关

参考技术A简单整理一下网关。在介绍网关之前,介绍一下BFF,BFF全称是BackendForFrontend,它负责认证授权,服务聚合,目标是为前端提供服务。说的通透一点,就是有没有见过这种服务。上述就是buff通过代理其他服务来让前端访... 查看详情

netcore磊科路由器怎么设置

...接密码。5、成功设置后,会出现成功设置的提示,此时重新启动一下路由器即可生效。参考技术A配置步骤(建议将路由器恢复出厂):①路由器WAN口,接现在宽带猫的网线②路由器LAN口,接电脑、电视机、机顶盒③假设猫不带... 查看详情

asp.netcore路由(router)配置和使用方法代码

本文主要介绍ASP.NETCore路由(router)配置和使用方法,.NETCore中MVC的路由的使用方法,和之前asp.netmvc中配置使用有些区别,但也不是很大。下面看一下具体配置使用方法。原文地址:ASP.NETCore路由(router)配置和使用方法代码 查看详情

asp.netcore依赖注入最佳实践——提示与技巧(代码片段)

在这篇文章,我将分享一些在ASP.NETCore程序中使用依赖注入的个人经验和建议。这些原则背后的动机如下:高效地设计服务和它们的依赖。预防多线程问题。预防内存泄漏。预防潜在的BUG。这篇文章假设你已经基本熟悉依赖注入... 查看详情

netcore磊科路由器怎么设置

...正确后会提示是否重启路由器,选择是确认重启路由器,重新启动路由器后即可正常上网。参考技术A所需工具材料:netcore磊科路由器配置方法如下:1、网线一端接路由器的WAN口,另一端接无线猫的LAN口。2、打开浏览器在地址... 查看详情