Asp.Net WebApi防重提交

 一、添加過濾器

 /// <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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章