0

同じドメイン内のASPXページを要求する(Msxml2.XMLHTTP ActiveXオブジェクトを使用した)IEの標準の単純なAJAXクエリがあります。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>
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宣言が存在する場合は、最初の行になければなりません)。したがって、2つの解決策があります。1つは、次のようにxml宣言を同じ行に移動します。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %><?xml version="1.0"?>

2つ目は、xml宣言を完全に削除することです。

それでも、content-typeを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 に答える