在 Windows Phone 8 中测试应用程序时,我偶然发现了一个奇怪的问题。我正在使用 xmlHttpRequest(不能使用 ajax,因为我需要作为 bufferarray 发送)来调用第三方 url。这在 Android 和 iOS 中完美运行,但在 WP8 示例中引发错误:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function (){
if(xhr.readyState == 4){
if(xhr.status==200){
alert(xhr.responseText);
}else{
console.log("Error: "+xhr.responseText);
}
}
}
console.log("1");
xhr.timeout = 30000;
console.log("2");
xhr.open("POST","http://google.com",true);
console.log("3");
xhr.setRequestHeader("Content-Type",contentType+"; boundary=" + boundary);
console.log("4");
//other headers / auth etc
console.log("about to post");
xhr.send(bodyBuf);
这将导致:
log:"before request"
log:"1"
log:"2"
log:"Error in error callback: Cameraxxxxx = InvalidStateError"
但是,如果我将开放更改为:
xhr.open("POST","google.com",true); //or www.google.com etc
这会直接发送,但由于找不到 url,所以会得到 404 状态。我显然没有在我的请求中使用谷歌,但错误是一样的。使用“http://”会出错,但如果没有,它不会出错但找不到 url。
任何想法表示赞赏。
我发现了一件事,但不确定它是否相关。根据 W3C html 5 文档,如果文档未完全处于活动状态(当它是其浏览上下文的活动文档时),则会在 open() 上抛出 InvalidStateError。如果这是错误的原因;文档如何不是活动文档以及如何定义不驻留在 url 上的应用程序的基本 url(文档建议将 base 设置为文档的文档基本 url(或设置源源/引荐来源))?
又近了一步。经过大量的摆弄,我最终发现由于某种原因,在 WP8 上需要在应用其他任何东西之前打开 xhr。因此,将 xhr.timeout 移到 xhr.open 以下是可行的。
这在我的特定情况下引发了另一个问题..但这可能是另一个话题。