当前位置: 首页 > news >正文

马鞍山建设集团有限公司网站百度云手机app下载

马鞍山建设集团有限公司网站,百度云手机app下载,网站信息优化的方式,ui设计素材库高并发下的接口请求重复提交问题 在.Net开发中#xff0c;我们经常遇到用户疯狂点击同一按钮#xff0c;或者服务响应慢时重复发送请求#xff0c;导致数据重复添加或混乱。这不仅浪费资源#xff0c;更会得到错误的业务结果。如何高效解决这一普遍问题呢#xff1f; 常规…     高并发下的接口请求重复提交问题 在.Net开发中我们经常遇到用户疯狂点击同一按钮或者服务响应慢时重复发送请求导致数据重复添加或混乱。这不仅浪费资源更会得到错误的业务结果。如何高效解决这一普遍问题呢 常规方案使用分布式锁 面对这问题分布式锁是一种有效的传统解决方案可以确保同一时间只有一个请求被处理。但面对众多需要锁定的接口配置分布式锁无疑是一项繁重的工作。如何优化这一流程 今天我带来了一种简洁高效的方案。透过.Net中间件的强大功能我们可以用一行代码轻松实现防并发。首先我们定义一个特性ApiLock并在中间件中实现基于用户或Token的Redis锁定。如此设计简单实用又易于扩展。 首先我们需要创建一个ApiLock得特性用于判断哪些接口需要执行分布式锁 public class ApiLockAttribute : ValidationAttribute{ public ApiLockAttribute(int maxLockTime 10, string msg 正在处理请稍等请勿重复提交)    { MaxLockTime maxLockTime; Msg msg; }public int MaxLockTime { get; set; } public string Msg { get; set; }} 然后我们需要写一个中间件如果不了解中间件的小伙伴可以查看下面文章进行学习https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?viewaspnetcore-8.0 我们需要创建一个中间件 public class ApiLockMiddleware : MiddlewareBase{ public override async Task Invoke(HttpContext context) { }} 然后我们需要再这个中间件里写一写逻辑我需要通过HttpContext 获取到Token(用户或者客户端),来进行唯一标识的判定。 public class ApiLockMiddleware : MiddlewareBase{ public override async Task Invoke(HttpContext context) { //获取请求路由 string url context.Request.Path.Value.ToLower(); }} 然后我们需要编写一个获取Endpoint的方法 private static Endpoint GetEndpoint(HttpContext context){ if (context null) { throw new ArgumentNullException(nameof(context)); } return context.Features.GetIEndpointFeature()?.Endpoint;} 这个方法用于获取请求的EndPoint来判断是否包含ApiLock的特性 public class ApiLockMiddleware : MiddlewareBase{ public override async Task Invoke(HttpContext context) { //获取请求路由         string url context.Request.Path.Value.ToLower();         var endpoint  GetEndpoint(context);         if (endpoint ! null) { var apiLock endpoint.Metadata.GetMetadataApiLockAttribute(); if (apiLock null) { //没有特性直接走 await base.Invoke(context); return; } else {                  //这里才是我们要写 核心逻辑。我们需要获取token//然后拼接token和url进行锁定                  using (var scope _scopeFactory.CreateScope()){ var redisLock scope.ServiceProvider.GetRequiredServiceIRedisLock(); var expiry TimeSpan.FromSeconds(apiLock .MaxLockTime);//超时时间如果内部执行超过expity则会释放锁 var wait TimeSpan.FromSeconds(3);//获取锁的时候等待的时间 var retry TimeSpan.FromSeconds(1);//每隔多少时间请求一次                  string key  $ApiLock:{用户/客户端Token}:{url};//锁的key 用户唯一IDAPI路由作为锁条件同一个接口没执行完前不允许执行下一次 using (var redLock await redisLock.CreateLockAsync(key, expiry, wait, retry)) { if (!redLock.IsAcquired) {                               //如果被锁定则返回特性传入的失败消息      await HandleExceptionAsync(context, new Exception(apiLock.Msg), (int)HttpStatusCode.OK); return; } else {                               //没有锁定才继续往后走Controller等业务逻辑 await base.Invoke(context); return; } } }                  } } }} 这里我们的中间件就写完了。我们需要写一个注册的方法 public static class ApiLockExtensions { /// summary /// 防止重复提交中间件 /// /summary /// param namebuilder/param /// returns/returns public static IApplicationBuilder UseApiLock(this IApplicationBuilder builder) { if (builder null) { throw new ArgumentNullException(nameof(builder)); }          return builder.UseMiddlewareApiLockMiddleware(); } } 然后我们需要再Configure里进行注册 public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider){ //…… app.UseApiLock();} 到这里我们的封装就已经完成了那么我们改如何使用它呢 [ApiController][Route(api/[controller]/[action])]public class TestController : ControllerBase{ [HttpPost] [ApiLock(10,接口被锁定请稍后再试)] public async TaskIActionResult TestApiLock() { await Task.Delay(20000); return Ok(); }} 这里也非常简单我们直接再需要使用锁定的接口上添加ApiLock的特性就可以啦我再这里对中间件提供了2个参数分别是锁定的最大时间和锁定后的错误提示。这个大家也可以按照自身业务需求来进行扩展。 然后我们测试一下这个接口这个接口里面做了20秒的延迟 我们可以看到当我们连续点击2次测试接口时我们发现第二次调用就会返回被锁定了。 简洁之美效率之王 这不仅是一种技术优化更是一种产品哲学的体现。在追求高效的同时我们更希望能让开发者从重复的工作中解放出来将更多的精力投入到创新和业务的核心中去。 即刻行动起来用最简洁的代码解决.Net API的高并发头疼问题吧
http://www.pierceye.com/news/976606/

相关文章:

  • 网站pv是什么意思vps开wordpress
  • 国外网站模版免费下载南通建设网站公司
  • 网站建设 广西学3d建模学费一般多少
  • 整站外包优化公司金山西安网站建设
  • 做3d动画网站广州公关公司排行榜
  • 网站开发确认表seo技术教程博客
  • 彩票网站建设一条龙淘客app
  • 泰安网站推广优化网站百度收录是什么意思
  • 免费虚拟主机控制面板长沙推广优化公司
  • 重庆企业网站建站公司建站系统
  • 规划设计网站推荐自己做采集电影网站
  • 免费学编程的网站有哪些做网站设计用什么软件
  • 网站成品超市学室内设计去哪好
  • 网站备案一个主体无锡建设银行网站
  • delphi xe10网站开发台州做网站多少钱
  • 怎样设计卖奖的网站做电影网站哪个服务器好
  • 找外包公司做网站的好处和坏处wordpress 访问量大
  • 淄博 网站设计越秀公司网站建设
  • 网站该如何做本地网站搭建软件
  • 如何做汽车团购网站学做馒头面包哪个网站好
  • 中国科技成就总结莱芜网站优化排名公司
  • 中国建设银行网站企业网银收费北京网站建设小程序开发
  • 成交型网站倡导公司网络营销课程总结1000字
  • 网站建设注册前端开发培训机构推荐
  • 遵义网站推广中国房地产app下载安装最新版
  • c语言网站建设禅城网站开发
  • 宁波品牌网站制作哪家好太平阳电脑网网站模板
  • seo网站外链工具看设计比较好的网站
  • 济南道驰网站建设有限公司怎么样某网站网站的设计与实现
  • 服装印花图案设计网站设计一个网站要多久