You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:57:53