我希望有人能帮助我。 有时我会在我的 Web 应用程序(ASP.NETCORE 6、IIS 10、React、Ant-Design)中遇到以下行为。 使用 Jquery-Ajax 触发的 Https-Request 在我的应用程序中处理了两次。 首先我认为我的客户端代码有问题,所以我实现了一个日志记录来找出用户在做什么。 但是调用 Ajax 的函数 btnBelegSpeichernClicked 只在应用程序中触发一次(根据 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;
});
}
这是后端控制器。 PS: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;
}
这是来自特定客户端 (10.133.29.108) 的 IP 地址的 IIS 日志(来自 Graylog):
2023-03-21 09:56:36.175 xxx.host.magwien.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.host.magwien.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
这种情况每月可能发生一两次,我们无法在测试系统中重现该问题。
非常感谢。