【问题标题】:Why is XMLHttpRequest.status == 0 on all the browsers except IE?为什么除了 IE 之外的所有浏览器上的 XMLHttpRequest.status == 0?
【发布时间】:2010-10-27 00:35:44
【问题描述】:

我快被这个弄疯了……

我使用 C# 制作了一个 RESTful.NET 网络服务,并作为独立服务运行。当我创建一个 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,但它对解决这个问题没有多大帮助... :(

编辑:我将这个问题的答案移到下面的评论中!

【问题讨论】:

  • 谷歌交易!很高兴你找到了答案。

标签: c# javascript ajax json rest


【解决方案1】:

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

这里有一篇文章解释它并解释如何解决问题。

http://ajaxpatterns.org/Cross-Browser_Component

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

【讨论】:

  • 嗨大卫!很抱歉回答的延迟;我最近很忙。我找到了解决方案!这是 HTTP 请求标头上的 Access-Control-Allow-Origin 的问题——同源策略的问题。请阅读我对原始帖子的编辑。感谢您的帮助!
  • PS:我已经尝试使用 ASP.NET Ajax 开发页面,但我有点沮丧,因为您构建服务器代码的方式与静态 HTML 页面或其他类型的不同的客户。但我得再试一次;这是我第一次尝试 ASP.NET xD
【解决方案2】:

目前的问题与同源政策有关。我在 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 上运行。但是,正如答案链接上所说,必须有更好的方法来解决这个问题。我会试着找到一些相关的:)

【讨论】:

    猜你喜欢
    • 2011-06-30
    • 2012-11-25
    • 2020-07-26
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    相关资源
    最近更新 更多