我在IE中使用标准的简单AJAX查询(使用Msxml2.XMLHTTP ActiveX对象),该查询请求同一域中的ASPX页面。虽然responseText字段包含完整的HTML,但在IE中,responseXML字段为空(这在Chrome中运行良好)。
作为调试过程的一部分,我将ASPX页面剥离了一点点XML,我甚至通过XML验证器运行它,以确保我没有错误输入任何内容。我将ASPX页面的内容类型更改为“text / xml”(IE将页面标识为页面属性中的XML文档),并将编码更改为“utf-8”(在页面级别和通过全球化标记)在web.config中。
当我的Web服务返回完全相同的内容时,AJAX代码没有任何问题。同样,AJAX在同一个项目中读取XML文件(包含内容的精确副本)也没有问题。它只是ASPX页面似乎无法解析。
我对UpdatePanels(ASP.NET 3.5)只有麻烦,所以我采用纯JavaScript方法。
有什么建议吗?我错过了什么吗?
AJAX代码
function NavigateResults(query) {
var xmlHttp;
try {
xmlHttp = new XMLHttpRequest();
} catch (e) {
// These are utilized for Microsoft IE browsers
try {
//alert('Boy... you should consider upgrading your browser.');
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
//alert('Whoa... no, seriously, you really need to upgrade!!!');
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
//alert("Yikes! Your browser does not support AJAX! Your inter-webs are broken! Call a 15-year old ASAP!");
window.location = url;
return false;
}
}
}
if (xmlHttp !== null) {
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
response = xmlHttp.responseXML;
var l_stringNode;
try {
l_stringNode = response.selectNodes("div")[0];
} catch (e) {
try {
l_stringNode = response.evaluate("div")[0];
} catch (e) {
l_stringNode = null;
}
}
alert("Response Text:\n\n" + xmlHttp.responseText);
alert("Response XML:\n\n" + xmlHttp.responseXML.xml);
//document.getElementById("SearchResultsDiv").innerHTML = xmlHttp.responseText;
if (l_stringNode !== null && l_stringNode.firstChild !== null) {
try {
var serializer = new XMLSerializer();
document.getElementById("SearchResultsDiv").innerHTML = serializer.serializeToString(l_stringNode);
} catch (e) {
// IE does not support serializeToString
document.getElementById("SearchResultsDiv").innerHTML = l_stringNode.xml;
}
}
}
}
var url = prompt("URL", "http://localhost:6168/Test.xml"); // + query + "&contType=xml");
xmlHttp.open("GET", url, true);
//prompt("URL", "http://localhost:4511/Service1.asmx/Autocomplete?prefix=test");
//xmlHttp.open("GET", "http://localhost:4511/Service1.asmx/Autocomplete?prefix=test", true);
xmlHttp.send(null);
}
}
测试XML (通过View Source从Test.aspx复制,与XML文件和来自Web服务的响应完全匹配)
<?xml version="1.0"?>
<ul>
<li>Testacea</li>
<li>Testament</li>
<li>Testudinata</li>
</ul>
答案 0 :(得分:0)
好的,我终于明白了。典型的ASPX页面顶部有页面信息,后跟内容,如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>
<?xml version="1.0"?>
<ul>
<li>Testacea</li>
<li>Testament</li>
<li>Testudinata</li>
</ul>
该页面信息实际上在输出的顶部创建了一个空行,这导致无效的XML(如果xml声明完全存在,则xml声明必须在第一行)。所以,有两种解决方案。一,将xml声明移到同一行,如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %><?xml version="1.0"?>
二,完全删除xml声明。
您仍必须将内容类型设置为text / xml。
protected void Page_Load( object sender, EventArgs e ) {
this.Response.ContentType = "text/xml";
this.Response.ContentEncoding = System.Text.Encoding.UTF8;
}