为什么除了IE之外的所有浏览器上的XMLHttpRequest.status == 0?

时间:2010-10-27 00:35:44

标签: c# javascript ajax json rest

我对这个感到疯狂......

我使用C#创建了一个RESTful.NET Web服务,并作为独立服务运行。当我创建XMLHttpRequest来检索JSON数据时,所有浏览器都会失败,除了IE,因为XMLHttpRequest实例的状态标志始终为0 - 它应该是200,这就是IE发生的情况。

我已经读过0是不在网络服务器上的静态html页面的正确值。所以,我安装了Apache并将页面放在那里,但结果是一样的(我可能错误地解释了这个建议......)

我运行了Fiddler,并且始终可以为任何浏览器正确检索请求!

这是我正在使用的JavaScript代码:

<script type="text/javascript">

var serviceURI = 'http://localhost:8889/WebService/client/25';
var xmlHttp = new XMLHttpRequest();

function clientHandler()
{
    if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
    {
        var json = xmlHttp.responseText;
        var client_id = document.getElementById('clientid');
        var client_name = document.getElementById('clientname');
        var client_address = document.getElementById('clientaddress');
        var client_phone = document.getElementById('clientphone');

        var client = eval('(' + xmlHttp.responseText + ')');
        client_id.value = client.id;
        client_name.value = client.name;
        client_address.value = client.address;
        client_phone.value = client.phoneNumber;
    }
    else
        alert("Error:\nxmlHttp.responseText = " + xmlHttp.responseText + "\nstatus = " + xmlHttp.status);
}

function sendRequest()
{
    if (xmlHttp)
    {
        xmlHttp.onreadystatechange = clientHandler;
        xmlHttp.open('GET', serviceURI, true);
        xmlHttp.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        xmlHttp.send(null);
    }
    else
        alert('xmlHttp not defined!');
}
</script>
如果有人能解释我发生了什么,我会很高兴的。我没有找到任何令人满意的探索......

另外,使用像jQuery这样的框架更好吗?

谢谢大家!

PS:我已经咨询了Jon Flanders的RESTful.NET,但它在解决这个方面没有太大作用...... :(

修改:我将此问题的答案移到了评论下面!

2 个答案:

答案 0 :(得分:3)

Internet Explorer使用与其他浏览器不同的对象来发出Ajax请求 Microsoft使用Microsoft.XMLHTTP对象,而其他浏览器使用XMLHttpRequest对象。

这里有一篇文章解释它并解释如何解决方法。

http://ajaxpatterns.org/Cross-Browser_Component

最好的办法是使用众多库中的一个来制作Ajax请求。 the'll会为你处理抽象。我看到你的帖子被标记为C#。如果是这种情况并且您正在使用Asp.NET开发页面,那么您可能正在使用标准的Asp.Net Ajax工具(ScriptManager和UpdatePanel),尽管很多人更喜欢使用JQuery。

答案 1 :(得分:3)

目前的问题与同源政策有关。我在StackOverflow上发现了2篇帮助我确定问题的文章:

问题的解决方案是here!我将以下行添加到服务器的方法中:

WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");

通过为每个方法添加此行,响应的标题如下:

HTTP/1.1 200 OK
Content-Length: 81
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/1.0
Access-Control-Allow-Origin: *
Date: Sun, 31 Oct 2010 02:34:34 GMT

<json data>

这种服务适用于Firefox,Safari,Chrome和IE。但是,正如在回答的链接上所说,必须有更好的方法来解决这个问题。我会试着找到一些关于它的东西:)