0

我在 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 (通过查看源从 Test.aspx 复制,与 XML 文件和来自 Web 服务的响应完全匹配)

<?xml version="1.0"?>
<ul>
  <li>Testacea</li>
  <li>Testament</li>
  <li>Testudinata</li>
</ul>
4

1 回答 1

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 声明移到同一行,如下所示:

<%@ 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;
}
于 2012-09-26T13:23:37.293 回答