巧用Newtonsoft.Json处理重复请求/并发请求?
生活随笔
收集整理的這篇文章主要介紹了
巧用Newtonsoft.Json处理重复请求/并发请求?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
背景
一些用戶請求在某些情況下是可能重復發送的,如果是查詢類操作并無大礙,但其中有些涉及寫入操作,一旦重復了,可能會導致很嚴重的后果。例如交易接口如果重復請求,可能會重復下單。
問題
假設我們把請求參數(JSON)按KEY做升序排序,排序后拼成一個字符串,作為 KEY 值呢?但這可能非常的長,所以我們可以考慮對這個字符串求一個 MD5 作為參數的摘要,以這個摘要去取代 reqParam 的位置。
String?KEY?=?"dedup:U="+userId?+?"M="?+?method?+?"P="?+?reqParamMD5;這樣,請求的唯一標識就打上了!
上面的問題其實已經是一個很不錯的解決方案了,但是實際投入使用的時候可能發現有些問題:某些請求用戶短時間內重復的點擊了(例如 1000 毫秒發送了三次請求),但繞過了上面的去重判斷(不同的 KEY 值)。
原因是這些請求參數的字段里面,是帶時間字段的,這個字段標記用戶請求的時間,服務端可以借此丟棄掉一些老的請求(例如5秒前)。
解決方案
這種請求,我們也很可能需要擋住后面的重復請求。所以求業務參數摘要之前,需要剔除這類時間字段。還有類似的字段可能是 GPS 的經緯度字段
代碼實現
請求去重工具類的代碼
{"Result":?{"AccName":?"New?2018-05-08?11:22:44","BeginTime":?"1970-01-01T00:00:00","EndTime":?null,"MaxDrawDownRate":?0.0,"AccountCorporation":?"","YearProfitPrecentage":?0.0,"CreateUserName":?"MatrixUser","HasDataType":?"期貨,股票","DataTypes":?[{"Value":?"8","Text":?"期貨","Name":?null},{"Value":?"1","Text":?"股票","Name":?null}],"SumAmount":?2000000.0,"CapitaleAmount":?2000000.0,"Cash":?0.0},"Head":?{"Message":?"獲取成功","Code":?"200","CallTime":?"2018-05-24?15:19:04"} }//移除某個屬性,以不返回該數據 JObject?jobject?=?JObject.Parse(json);??????????? JObject?tokenselect?=?jobject.SelectToken("Result")?as?JObject; tokenselect.Remove("DataTypes");using?Newtonsoft.Json.Linq;public?ActionResult?Detail(int?id)//待處理的josn字符串string?json="";//移除某個屬性,以不返回該數據JObject?jobject?=?JObject.Parse(json);???????????JObject?tokenselect?=?jobject.SelectToken("Result")?as?JObject;tokenselect.Remove("DataTypes");return?Json(tokenselect); }var?skuListJson=[{"ProductCategorySysNo":"467011276116070400","MalfunctionsSysNo":"467011100731248640","PropertyValueSysNos":"467011331313111040,467011331510243328,467011332495904768","SysNo":"467011332256829440","Price":2500.00},{"ProductCategorySysNo":"467011276116070400","MalfunctionsSysNo":"467011100731248640","PropertyValueSysNos":"467011331313111040,467011331510243328,467011331845787648","SysNo":"467011331208253440","Price":2000.00},{"ProductCategorySysNo":"467011276116070400","MalfunctionsSysNo":"467011095232516096","PropertyValueSysNos":"467011326095396864,467011326493855744,467011330340032512","SysNo":"467011330189037568","Price":0.00}];?Newtonsoft.Json.Linq移除對象中不需要的屬性或字段 JArray對應的是集合,JObject對應一條記錄 //list是一個C#List<T>對象泛型集合 JArray?jArray?=?JArray.FromObject(list); //方式二:這樣也行 //JArray?jArray?=JArray.Parse(skuListJson); foreach?(JObject?item?in?jArray) {??????????????//移除屬性SysNo、ProductCategorySysNoitem.Remove("SysNo");item.Remove("ProductCategorySysNo"); }????????? //最後在將jArray序列化為json字符串 string?skuListJson?=?JsonConvert.SerializeObject(jArray);總結
以上是生活随笔為你收集整理的巧用Newtonsoft.Json处理重复请求/并发请求?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .Net单元测试方法
- 下一篇: EF Core中高效批量删除、更新数据的