【问题标题】:jQuery .ajax not triggering the error callback on localhost requestsjQuery .ajax 没有触发本地请求的错误回调
【发布时间】:2011-02-10 03:32:52
【问题描述】:

我创建了一个在本地运行的 Windows 服务,并提供了一个可以通过 ajax 调用与之通信的 Web 服务。我正在尝试编写一些代码来检测 Web 服务是否在 localhost 上运行,以便在应用程序未运行时提示用户安装该应用程序。当服务未运行时,.ajax 调用不会触发错误回调,即使在超时之后也是如此。这是我现在正在运行的代码

$.ajax({ url: 'http://localhost:12345/GetVersion/',
        dataType: 'json',
        timeout: 1000,
        complete: function() {
            alert('complete');
        },
        success: function() {
            alert('success');
        },
        error: function() {
            alert('error');
        }
    });

当服务运行时,完成和成功都会被调用。当服务停止时,我永远不会收到完整或错误警报。

任何想法为什么回调永远不会被触发?有没有其他方法可以通过简单地调用其中一种方法来查看服务是否正在运行?


更新: Fiddler 没有报告 localhost 或 127.0.0.1 请求的任何内容,因此我为我们的域创建了一个指向 127.0.0.1 的子域。当服务运行时,子域按预期工作,当服务未运行时,提琴手给我这个错误:
[Fiddler] Connection to localhost.stayhealthy.com failed.Exception 
Text: No connection could be made because the target machine actively refused it 127.0.0.1:49994

我仍然在拨打电话的网站上得到相同的结果。永远不会触发错误回调。


更新 2: 这是一个完整的工作示例,您应该可以使用它进行测试。

<html>
<head>
    <title>Ajax Localhost Test</title>
    <script language="javascript" type="text/javascript" src="jquery-1.4.2.js"></script>
    <script language="javascript" type="text/javascript">
        $(document).ready(function(){
            $('#messages').append("Starting<br />");

            $.ajax({ url: 'http://localhost:12345/GetSomething/?callback=?',
            dataType: 'json',
            timeout: 1000,
            complete: function() {
                $('#messages').append("Complete<br />");
            },
            success: function(version) {
                $('#messages').append("Success<br />");
            },
            error: function(request, status, error) {
                $('#messages').append("Error<br />");
            }
        });
        });
    </script>
</head>
<body>
    <h1>Ajax Localhost Test</h1>
    <div id="messages"></div>
</body>
</html>

除非您在 localhost:12345 上运行服务,否则调用应该失败,但永远不会触发错误或完成。

【问题讨论】:

  • 运行 Fiddler 看看会发生什么。
  • 当我点击 localhost 或 127.0.0.1 时,即使服务正在响应,Fiddler 也不显示任何请求。
  • 你用什么浏览器来测试这个,我在 FF 中测试了你的代码,它运行良好。在 IE 中它似乎不起作用。 IE 说:访问被拒绝。
  • 文件显示为 file:/// - 样式 URI?
  • 我已经在最新版本的 IE、FF 和 Chrome 中进行了测试。没有运气从他们中的任何一个那里得到错误响应。我添加了一个完整的工作示例并将其添加到原始问题中。

标签: jquery


【解决方案1】:

这已在 jquery 1.5 中得到修复。原始帖子中的脚本现在按预期工作,我可以摆脱计时器解决方法。

【讨论】:

    【解决方案2】:

    我假设您的网页是从不同的域(或端口)提供的。
    因此,如果您尝试请求不同的域,则会收到同域错误。

    既然你说它在服务运行时可以正常工作,我假设该服务有一个 CrossDomain.xml 允许站点使用它。

    当服务没有运行时,这个文件是不可访问的。

    【讨论】:

    • 我们正在使用 JQuery 的 jsonp 来解决跨域脚本问题。即使没有响应,jquery .ajax 调用是否应该超时或报告某种错误?我需要一个错误或某种触发的超时来确认服务没有运行,以便我可以为用户显示适当的操作。
    【解决方案3】:

    我可以使用 jquery 计时器插件 (http://plugins.jquery.com/project/timers) 解决此问题,但我仍然想知道为什么 .ajax 调用在本地主机上未运行服务时没有任何通知就失败了。

    如果服务不工作,以下是我期望的行为。

    <html>
    <head>
        <title>Ajax Localhost Test</title>
        <script language="javascript" type="text/javascript" src="jquery-1.4.2.js"></script>
        <script language="javascript" type="text/javascript" src="jquery_timers-1.2.js"></script>
        <script language="javascript" type="text/javascript">
            $(document).ready(function(){
                $('#messages').append("Starting<br />");
    
                $('#messages').oneTime(1000, function(){
                    $('#messages').append('Could not find service');
                });
    
                $.ajax({ url: 'http://localhost:12345/GetSomething/?callback=?',
                dataType: 'jsonp',
                timeout: 1000,
                complete: function() {
                    $('#messages').append("Complete<br />");
                    $('#messages').stopTime();
                },
                success: function(version) {
                    $('#messages').append("Success<br />");
                },
                error: function(request, status, error) {
                    $('#messages').append("Error<br />");
                }
            });
            });
        </script>
    </head>
    <body>
        <h1>Ajax Localhost Test</h1>
        <div id="messages"></div>
    </body>
    </html>
    

    如果您运行它,计时器将永远不会停止,因为永远不会达到完整的操作。所以计时器过去了并报告它无法连接到服务。

    【讨论】:

      猜你喜欢
      • 2012-08-17
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多