jQuery .ajax不会触发localhost请求的错误回调

时间:2010-02-21 03:43:59

标签: jquery

我已经创建了一个在本地运行的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');
        }
    });

当服务运行时,将调用complete和success。当服务停止时,我从未收到完整或错误警报。

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

<小时/> 更新: Fiddler没有报告任何有关localhost或127.0.0.1请求的内容,因此我为我们的域创建了一个指向127.0.0.1的子域。当服务运行时,子域按预期工作,当服务未运行时,fiddler给出了这个错误:

[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上运行服务,否则调用将失败,但永远不会触发错误或完成。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我认为您的网页是从其他域(或端口)提供的 因此,如果您尝试请求其他域,则会出现同域错误。

由于您说服务运行时它工作正常,我假设该服务有一个CrossDomain.xml,允许该站点使用它。

当服务未运行时,此文件无法访问。

答案 2 :(得分:0)

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

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

<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>

如果你运行它,计时器永远不会停止,因为永远不会达到完整的动作。因此计时器过去并报告它无法连接到服务。