ASP.NET Core 6应用中jQuery Ajax请求重复处理问题排查求助
请求重复处理排查求助
我的Web应用基于ASP.NET Core 6、IIS 10、React、Ant-Design,偶尔会出现jQuery Ajax发起的HTTPS请求被重复处理两次的问题。
一开始我以为是客户端代码问题,特意添加了日志记录用户操作,根据console.log的记录,发起请求的函数btnBelegSpeichernClicked仅被触发一次,但IIS日志和数据库却显示该请求被成功处理了两次。
我想知道应该从哪些方向进一步排查问题根源,不想只做临时规避方案,希望找到问题的本质所在。
前端代码
const btnBelegSpeichernClicked = (values: any) => { LoggingApp(BuildInfoStringForLoggingApp("btnBelegSpeichernClicked"), false); if (BelegSpeichernRunningGlobal) { return; } BelegSpeichernRunningGlobal = true; let belegForSpeichern: BelegSpeichern = new BelegSpeichern(); belegForSpeichern.beleg = new Beleg(); belegForSpeichern.beleg.text = values.belegtext; $.ajax({ type: "POST", url: "api/Beleg/Speichern", data: JSON.stringify(belegForSpeichern), contentType: "application/json;charset=utf-8", global: true, async: true, dataType: "json" }).done( function (ajaxResultBeleg: BelegSpeichernResult, status, req) { BelegSpeichernRunningGlobal = false; } ).fail( function (jqxhr: JQueryXHR, textStatus: JQuery.Ajax.ErrorTextStatus, errorThrown: string) { BelegSpeichernRunningGlobal = false; } ); }
后端控制器代码
注:KeschKassaRunning.cs是一个ConcurrentDictionary,用于存储收银台ID,限制同一收银台同时处理两个请求
[Route("Speichern")] [HttpPost] public BelegSpeichernResultDTO BelegSpeichern([FromBody] BelegSpeichernDTO inPara) { string loggedInUser = Utils.GetLanuser(this.HttpContext); try { BelegSpeichernResultDTO returnDTO = new BelegSpeichernResultDTO(); try { string checkRun = KeschKassaRunning.CheckRunning(inPara.beleg.id_kassa); if (checkRun != null) { returnDTO.error_liste.Add(checkRun); return returnDTO; } else { KeschKassaRunning.runningIdKassaList.TryAdd(inPara.beleg.id_kassa, DateTime.Now); } } catch (Exception ex) { Core.Utils.WriteLoggingApp(ex, loggedInUser); returnDTO.error_liste.Add("Aktion fehlgeschlagen. Bitte versuchen Sie es erneut."); return returnDTO; } using (dbmodel db = new dbmodel()) { BelegErfassenBS bs = new(); BelegSpeichernResultBO bsResult = bs.Journalerfassung(UtilsDtoBuilder.MapSpeichernDTOtoSpeichernBO(inPara), loggedInUser, HttpContext, db, true); returnDTO.warning_liste = bsResult.warning_liste; returnDTO.error_liste = bsResult.error_liste; if (bsResult.beleg_for_print_liste != null) { returnDTO.beleg_for_print_liste = new List<BelegDTO>(); foreach (BelegBO item in bsResult.beleg_for_print_liste) { returnDTO.beleg_for_print_liste.Add(BuildBelegForPrintDTO(item)); } } try { if (bsResult.error_liste != null && bsResult.error_liste.Count > 0) { Core.Utils.WriteLoggingAppToDatabase(BuildLoggingString(bsResult), loggedInUser); } } catch (Exception ex) { Core.Utils.WriteLoggingApp(ex, loggedInUser); } } try { KeschKassaRunning.RemoveRunningKassa(inPara.beleg.id_kassa); } catch (Exception ex) { Core.Utils.WriteLoggingApp(ex, loggedInUser); } return returnDTO; } catch (Exception ex) { Core.Utils.WriteLoggingApp(ex, loggedInUser); KeschKassaRunning.RemoveRunningKassa(inPara.beleg.id_kassa); throw; } }
IIS日志(来自Graylog)
客户端IP:10.133.29.108
2023-03-21 09:56:36.175 xxx.xxx.xxx.gv.at 2023-03-21 08:56:22 10.153.87.9 POST /xxx/api/Beleg/Speichern - 8443 - 10.153.121.50 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/111.0.0.0+Safari/537.36 https://www.topsecret/xxx 200 0 0 9640 3022 29119 095548$88biv@8029p70 10.133.29.10
2023-03-21 09:56:12.144 xxx.xxx.xxx.gv.at 2023-03-21 08:55:52 10.153.87.9 POST /xxx/api/Beleg/Speichern - 8443 - 10.153.121.51 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/111.0.0.0+Safari/537.36 https://www.topsecret/xxx 200 0 0 9640 3020 15766 095536$rwpg@8029p71 10.133.29.10
该问题每月大概出现1-2次,且无法在测试环境复现。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

