首页 > 编程语言 >Asp.Net WebApi防重提交

Asp.Net WebApi防重提交

时间:2023-08-08 09:12:58浏览次数:33  
标签:WebApi string actionContext cacheName 提交 防重 Net public reValue

 一、添加过滤器

 /// <summary>
    /// 重复提交
    /// </summary>
    public class ReSubmitAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 操作成功提示消息
        /// </summary>
        public string SuccessMsg = null;

        /// <summary>
        /// 方法执行前的拦截方法
        /// </summary>
        /// <param name="actionContext"></param>
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if (actionContext.Request.Method == HttpMethod.Post)
            {
                string reValue = HttpContext.Current.Request.Form["ReFlag"];
                if (string.IsNullOrEmpty(reValue))
                {
                    actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, BaseResult.GetError("提交数据中必须包含防重提交标识"), "application/json");
                    return;
                }
                string cacheName = RedisHelper.GetCacheName(RedisCacheType.ReSubmit, reValue);
                string cacheValue = CacheManager.GetCache(cacheName);
                string submitValue = actionContext.ActionArguments.Count > 0 ? MD5Helper.MD5Encrypt32(SerializeHelper.ToJson(actionContext.ActionArguments)) : "0";
                if (string.IsNullOrEmpty(cacheValue) || cacheValue.Equals(submitValue) == false)
                {
                    CacheManager.SetCache(cacheName, submitValue, TimeSpan.FromMinutes(1), Tools.Cache.Redis.ExpirType.Absolute);
                    return;
                }
                if (cacheValue.Equals(submitValue))
                {
                    actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, BaseResult.GetSuccess(string.IsNullOrEmpty(SuccessMsg) ? "操作成功" : SuccessMsg), "application/json");
                    return;
                }
            }
        }

        /// <summary>
        /// 删除重复提交标识
        /// </summary>
        public static void RemoveReFlagCache()
        {
            string reValue = HttpContext.Current.Request.Form["ReFlag"];
            if (string.IsNullOrEmpty(reValue) == false)
            {
                string cacheName = RedisHelper.GetCacheName(RedisCacheType.ReSubmit, reValue);
                CacheManager.RemoveCache(cacheName);
            }
        }
    }

 二、添加实体基类

    /// <summary>
    /// 防重提交实体
    /// </summary>
    public abstract class ReSubmitModel
    {
        /// <summary>
        /// 防重提交标识
        /// </summary>
        [Ignore]
        public Guid ReFlag { get; set; } = Guid.NewGuid();
    }

三、将返回实体类继承ReSubmitModel

标签:WebApi,string,actionContext,cacheName,提交,防重,Net,public,reValue
From: https://www.cnblogs.com/5tomorrow/p/17613271.html

相关文章

  • .net core 单文件发布,找不到appsettings.json的问题
    解决方案config.SetBasePath(GetBasePath());config.AddJsonFile("appsettings.json",false);privatestringGetBasePath(){usingvarprocessModule=Process.GetCurrentProcess().MainModule;returnPath.GetDirectoryName(processModule?.FileName......
  • ASP.NET Core对象池
    【C#/.NET】使用ASP.NETCore对象池 NugetMicrosoft.Extensions.ObjectPool 使用对象池的好处减少初始化/资源分配,提高性能。这一条与线程池同理,有些对象的初始化或资源分配耗时长,复用这些对象减少初始化和资源分配。比如:我有一个执行耗时约500毫秒,内存空间2KB的任务......
  • .Net 构建Opc Ua服务器和客户端
    PackagenamedOpc.UaFx.Advancedisfoundinhttps://www.nuget.org/packages/Opc.UaFx.AdvancedthatusedasaOpcUaServerandClient.Firstofall.InstallpackagedotnetaddpackageOpc.UaFx.Advanced--version2.31.0usingOpc.UaFx;usingOpc.UaFx.Client;......
  • nacos 系列:.net core 6.0 使用 nacos
    目录安装Nuget包配置appsettings.json添加服务和配置测试官方示例:https://kgithub.com/nacos-group/nacos-sdk-csharp安装Nuget包dotnetaddpackagenacos-sdk-csharp.AspNetCoredotnetaddpackagenacos-sdk-csharp.Extensions.Configuration配置appsettings.json......
  • rider下载安装 一款.Net跨平台开发神器 安装指南
    rider下载安装一款.Net跨平台开发神器安装指南原文链接:https://baijiahao.baidu.com/s?id=1763943888509043020&wfr=spider&for=pc下载破解补丁后,解压得到,如下图:将上面图示的补丁的所属文件夹/jetbra复制电脑某个位置,小编这里放置到了默认的下载目录下(不推荐,自己选个D盘目......
  • 从浅入深了解.NET Core MVC 2.x全面教程
    一、基础1.默认配置使用KestrelWebServerASP.NETCore内置——跨平台IIS集成UseIIS()UseIISIntergration()LogIConfiguration接口2.IConfiguration配置信息的来源appsettings.jsonUserSerets环境变量命令行参数XML...3.管道4.MVC5.路由RoutingConcentionalRoutingAttributeRou......
  • How to get User Name from External Login in ASP.NET Core?
    HowtogetUserNamefromExternalLogininASP.NETCore? 回答1DoyouhaveaccesstoSignInManagerorcanyouinjectit?Ifyes,thenthisishowyouwouldaccessuserid(username),email,first&lastname:publicclassMyController:Microsoft.Asp......
  • 后台是.net的话前端该用什么框架??
    如果你在后端使用.NET,以下是几个流行的前端框架可以考虑使用:1.React:-优点:React是一个由Facebook开发的JavaScript库,它专注于构建用户界面。它采用组件化的开发模式,使得构建复杂的UI变得简单且可维护。React具有高度的灵活性和可重用性,能够提供出色的性能。2.Angular:-......
  • kubernetes-Deployment和DaemonSet
    在Kubernetes中,Deployment和DaemonSet是两个不同的资源类型,用于不同的目的。Deployment用于在集群中运行可扩展的应用程序,可以管理Pod的副本数量,执行滚动升级和回滚操作。DaemonSet用于确保在集群的每个节点上运行一个Pod副本。它通常用于部署运行在每个节点上的系统级别的服务......
  • 无涯教程-Perl - endnetent函数
    描述此功能告诉系统您不再希望使用getnetent从网络列表中读取条目。语法以下是此函数的简单语法-endnetent返回值此函数不返回任何值。例以下是显示其基本用法的示例代码-#!/usr/bin/perluseSocket;while(($name,$aliases,$addrtype,$net)=getnetent())......