0

我有一个用 ASP.NET MVC 4 编写的 Web 应用程序。在用户体验期间,客户端大量使用 JQuery 来执行保存和检索数据的请求。在某些时刻,用户可以更改一些数据并单击类似按钮的链接来保存它。对于架构/性能/要求的限制,这个过程分为两个步骤:

  1. POST 请求被发送到服务器到给定的 URL(这将触发某个控制器的某个动作),其中包含一个 JSON 对象;
  2. 在第一次 POST 成功时,计时器会设置为向同一服务器运行第二次 POST,但 URL 不同(同一控制器中的另一个操作),根本没有内容。

第二个 POST 将开始一个补充过程,并总结第一个 POST 开始的内容。但是,它永远不会获得服务器。$.ajax 方法触发错误处理程序。

第一个请求代码的简化版本是

$.ajax({
       url: self.opcoes.urlCreate,
       type: "POST",
       data: JSON.stringify(lancamento),
       dataType: "json",
       contentType: "application/json; charset=utf-8",
       success: function (data) {
           self.LancarDia(250);
       },
       error: function (jqXHR, textStatus, errorThrown) {
           alert("Não foi possível incluir o lançamento. O servidor retornou\n" +
                          ajaxErrorMessage(jqXHR, textStatus, errorThrown));
       }
});

LancarDia()方法接收毫秒量来设置第二个请求的计时器,所以想法是等待 250 毫秒,然后发送第二个请求。LancarDia ()代码是:

MyClass.prototype.LancarDia = function (milisegundos) {
    var self = this;
    if (milisegundos) {
        if (self.timerLancarDia)
            clearTimeout(self.timerLancarDia);
        self.timerLancarDia = setTimeout(function () {
            self.LancarDia();
            self.timerLancarDia = undefined;
        }, milisegundos);
        return;
    }
    $.ajax({
        url: self.opcoes.urlLancarDia + self._dataAtual.format("MM/dd/yyyy"),
        type: "POST",
        success: function (data) {
            if (self.opcoes.onLancou)
                self.opcoes.onLancou(self._dataAtual);
        },
        error: function (jqXHR, textStatus, errorThrown) {
            var mensagem = "Não foi possível atualizar o MUMPS. Motivo:\n" +
                           ajaxErrorMessage(jqXHR, textStatus, errorThrown);
            alert(mensagem);
        }
    });
}

请注意,第一个 POST始终有效,第二个失败多次,并非总是如此。当它失败时,我得到的是:

  • jqXHR.status == 0
  • jqXHR.readystate == 0
  • textStatus == "错误"
  • 错误抛出 == ""

在它的第一个版本中,代码没有使用任何计时器。在第一个 POST 成功后,第二个被立即发送。据报道,更改为当前实现可以降低问题的频率,但它仍然会发生。

只有 Chrome 显示此问题,FireFox 和 IE 运行干净。

有没有人遇到并解决了这个问题?

提前致谢

4

2 回答 2

0

You mention the second POST never gets sent to the server, how are you verifying this? It sounds more like a race condition where the second request is being sent before the server is ready for it (e.g. it is still doing something that was started by the first request).

于 2013-08-30T18:05:47.490 回答
0

经过长时间的研究,我们的基础架构人员发现问题是由浏览器(Chrome)的缓存策略和Web服务器(IIS 7)中配置的缓存策略引起的。

将 IIS 配置为在缓存控制响应标头中添加no-cache后,问题就消失了。

于 2013-09-10T13:36:22.240 回答