jQuery Ajax在Chrome浏览器中出现随机错误

9

问题摘要

通过表单身份验证使用 Chrome 登录后,landing 页面作为 returnUrl 会导致我的 jQuery ajax 出错,但没有与服务器连接。状态码为0,消息为"error"。(几乎没用)。尝试过 Firefox,无法复现该问题,我开始觉得 Chrome 是问题所在。清除缓存、关闭和重新打开并不能解决问题。最接近的文章是这篇:jQuery Ajax - Status Code 0? 但是,URL 是相对的,/Test

另一篇文章:jquery ajax problem in chrome

详细描述

我在 jQuery ajax 中遇到了一个错误。似乎是在使用表单身份验证登录后,着陆页面(returnUrl)会出现 JS 错误。然后刷新页面(F5),脚本就能正常工作(大多数情况下)。即使不使用 F5,在使用链接导航到相同的页面时,JS 也会正常工作(大多数情况下)。因此,直接在登录后进行测试是我的主要测试路径。

同时,在另一个选项卡中导航到/Test操作,也能正常工作。原始选项卡仍然会出错,直到我按照前面提到的导航或刷新它。

我有时候在导航或 F5 刷新后仍然会出现错误。因此,在开头段落中使用“大多数”这个词。

Javascript 错误反馈

我所能收集到的信息只有一个状态码为0和一个错误消息为"error"

软件和版本

ASP.NET MVC 3
Chrome v28.0.1500.72 m
jQuery v1.8.3
AttributeRouting

使用Chrome时,我也尝试了清空缓存和CTRL+F5。

MVC
我有一个由[Authorize(Roles = "Admin")]保护的操作。禁用此属性似乎解决了我的问题,但后来又出现了问题。如果之前的陈述让您感到困惑,请原谅。哈哈,头发少!

[GET("Test")]
public ActionResult Test()
{
    Console.WriteLine("Test");
    return new EmptyResult();
}

任何JavaScript脚本文件都不会位于受表单身份验证保护的文件夹后面。
jQuery doc.ready
我有一个jQuery错误事件,我已经使用它来暂停调试,以查看对象的内容。
//-- while I am using this method, I have also used the `error: ` 
//-- part of $.ajax with the same result.
    $(function ()
    {
        $(document).ajaxError(function (event, jqxhr, settings, exception)
        {
            Debug.Log("event: " + event);
            Debug.Log("jqxhr: " + jqxhr.responseText);
            Debug.Log("settings: " + settings);
            Debug.Log("exception: " + exception);
        });
    });

我有一个使用以下事件加载的jQuery方法。虽然以下脚本看起来可能会对服务器造成压力,但是有定时逻辑确保它每5秒钟只执行一次。

$(document).on('mousemove','*',function(e){ TestMethod(this,e,'mousemove');});

Javascript方法

这是我尽量简化的ajax调用。

   function TestMethod(sender, e, eventTrgger)
    {
        $.ajax(
        {
            type: "GET",
            url: '/Test',
            dataType: 'html',
            success: function (html)
            {
                //-- tested with nothing here.
            }
        });
    }

Fiddler

当发生错误时,Fiddler不会显示GET请求,这意味着服务器没有被访问。此外,在操作中放置调试器断点可以确认该操作未被访问。

附加信息: 由于ajax调用每5秒钟发生一次。当在页面上看到状态为0和错误-"error"时,我清除缓存,而不刷新页面,Chrome和ajax请求开始工作。记录一下,我的Chrome缓存设置尽可能地小。


移除 AuthorizeAttribute 后它能正常工作,而“服务器没有被访问”的概念似乎完全不相关。 - Richard Neil Ilagan
我刚刚禁用了该属性,但同时也导航到了准备好的带有returnURL的登录表单。问题出现了。我更新了Q以指示在您阅读后......尝试了很多不同的路径。 - Valamas
我遇到了非常类似的问题。在刷新几个页面后,GET请求会中断,我认为这与同样的问题有关。这个问题在Chrome 29中修复了吗? - Eric Pauley
1个回答

8
问题似乎是Chrome 28处理GET请求的缓存存在错误。版本27正常工作,而版本28中的POST请求也能正常工作。
您可以通过在$.ajax()调用中将'cache'属性设置为false来解决此问题。

好的,目前为止一切都很顺利!我今天将继续测试它。我已经用Alert替换了我的console.log。所以很快我就会知道这个解决方案是否有效。感谢你找到它。也许可以在答案中添加一个问题的超链接? - Valamas
在我的Mac上,29.0.1547.65版本出现了这个问题,在$.post调用中响应为http 0(因此肯定是http post)。Charles没有显示任何http请求。开始通过jquery进行调试,试图找出xhr是否存在潜在错误。 这让我疯狂了一段时间,但最终只需将"?r=" + Math.random()添加到我的URL(相对路径为/Keepalive.ashx),http状态码0就消失了,一切都正常工作了。 - agrath
我在Chrome 29中也遇到了这个错误,但在Chrome 30中似乎已经修复了。将缓存设置为false可以在Chrome 29中解决此问题。 - Richard Deurwaarder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接