4

当我使用下面的代码从我的服务器执行一个简单的XML HTTP 请求时

var targetUrl = "http://server/Service1.svc?input1=uno&input2=duo";
document.getElementById("console").innerHTML += "<br>commencing";

var xhr = new XMLHttpRequest();
xhr.onload = function () {
  document.getElementById("console").innerHTML += "<br>callbacking";
  alert(xhr.responseText);
}

xhr.open("GET", targetUrl);
document.getElementById("console").innerHTML += "<br>finishing";

xhr.send();

我在 FireBug 的控制台中得到状态码 302。根据这篇 W3 文章,状态码 302 表示资源被临时重定向。我不能完全确定这对我来说意味着什么,因为当我在 FireFox 中输入我的 URL 时,我得到了应有的响应,看起来很棒。

关于这个问题有很多文章,但我无法直截了当。例如,这个只是重申了状态码的定义。这个建议使用HEAD而不是GET但在我的情况下这不是一个选项(除非绝对必要)。这里甚至声称状态代码 302会自动导致正确重定向到页面移动到的位置(导致状态代码 200),在我的情况下这不是真的。

我试过看,xhr.getRespoonseHeader("Content-Type")但显然,它是null.

我被困住了。我能做些什么来解决我的问题?

4

2 回答 2

2

看起来您的服务器是:

  • 将非 www 重定向http://到 wwwhttp://www.
  • 将不安全的 HTTP 重定向http://到安全的 HTTPShttps://

在您的网络浏览器中,查看http://server/Service1.svc?input1=uno&input2=duo并观察地址栏。它有任何改变吗?检查是否www已添加,或https.

您还可以将您的 javascript URL 更改为 www 版本和 https 版本,以查看是否可以修复它。

编辑:根据您对https的说法,我认为它将http重定向到https。您的 ajax 代码不正确,因此这将解释为什么回调不起作用。

您需要使用onreadystatechange事件(不是 onload)并检查状态4,这意味着它已完成:

xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
            document.getElementById("console").innerHTML += "<br>callbacking";
            alert(xhr.responseText);
    }
}
xhr.open("GET", targetUrl, true);
xhr.send(null); 
于 2012-11-21T17:23:12.027 回答
1

它可能与 IIS 服务器上的一些内部重定向有关。我还会检查该服务是否安装在应用程序池中。

此外,它可能类似于协议切换或域歧义(即安全/不安全的 http 和/或带有/sans w3 前缀)。

于 2012-11-27T21:04:40.050 回答