Aufrufen von WebMethods mit XmlHttpRequest und Reinem JavaScript

Habe ich, was sollte eine relativ einfache Aufgabe, ehrlich gesagt hat mich etwas verblüfft. Ich hab recherchiert, bis mein Gehirn ist gebraten, und jetzt bin ich punting, und bitten Euch um Hilfe.

Hier ist das Szenario:

  • Ich habe eine ASPX-Seite (Q2).aspx), die verziert ist mit der WebService,
    WebServiceBinding, und ScriptService Attribute.
  • Diese Seite enthält eine Methode, die GetAllContacts, dekoriert ist, mit der WebMethod
    Attribut und gibt einen string mit JSON-Daten. (Für was es Wert ist, die Seite
    selbst enthält keine weiteren Steuerelemente oder Funktionen.)
  • Ich habe eine HTML-Seite mit JavaScript, die verwendet die XmlHttpRequest
    Objekt zum aufrufen des GetAllContacts WebMethod auf der ASPX-Seite und verwandeln
    die JSON-Daten in eine HTML-Tabelle.
  • Ich habe überprüft, dass mein Web.Config - Datei enthält die entsprechenden Protokoll-Handler
    für HttpGet und HttpPut im WebServices Abschnitt unter System.Web.webServices.
  • Ich habe überprüft, dass mein Web.Config - Datei enthält die ScriptModule Eintrag unter
    System.webServer.modules Abschnitt, und dass Sie mit der entsprechenden Dokumentation.

Jedoch, wenn ich eine HTML-Seite in einem browser die folgende auftreten:

  • Die web-Antrag geht durch, aber die Ergebnisse sind für die nicht verarbeiteten HTML-Code aus der ASPX-Seite.
  • Die GetAllContacts - Methode niemals aufgerufen wird, wie dies durch setzen eines Breakpoints im code.
  • Der code zum aufrufen des Web-service, ist aber aufgerufen, und die JavaScript-callback
    Funktion, die aufgerufen wird, auf Antrag, die Fertigstellung ist richtig aufgerufen.

Scheint es, dass der JavaScript-code ist weitgehend korrekt eingerichtet, aber für einige Grund, die vollständig entweicht mir an dieser Stelle die HTML-Seite wird einfach nicht ausgeführt WebMethod auf der ASPX-Seite, und gibt einfach die Seite, als wäre es eine Reine HTML - GET Anfrage. Klar, ein HTML-Dokument kann nicht ausgewertet werden, indem JavaScript eval - Funktion, die bringt mich zu meinem problem. (Beachten Sie auch, dass die JSON-Daten erscheint nirgends in den HTML-Code, der zurückgegeben wird.)

Ich bin, ehrlich gesagt, ratlos. Ich habe Dutzende von Microsoft-Artikeln, StackOverflow-posts, CodeProject-Artikel, und wer weiß was sonst noch. Mein code sieht wie es ist okay. Aber ich weiß es besser. Bin ich etwas fehlt einfach, dumm und offensichtlich. Ich brauche nur jemanden, um es darauf hin zu mir.

Unten finden Sie die ASPX-Seite code und den HTML-code, in der Hoffnung, dass Sie dann etwas Licht.

ASPX-Code

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Q2.aspx.cs" Inherits="Satuit.Q2" enablesessionstate="False" %>
<html>
    <body>
        <form runat="server" id="frmMain"/>
    </body>
</html>
-- Codebehind
using System.IO;
using System.Web;
using System.Web.Script.Services;
using System.Web.Services;
using System.Web.UI;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;

namespace Satuit
{
    [WebService(Namespace="http://tempuri.org")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [ScriptService]
    public partial class Q2 : Page
    {

        [WebMethod]
        public static string GetAllContacts()
        {
            return LoadJsonData();
        }

        private static string LoadJsonData()
        {
            using (var stringWriter = new StringWriter())
            {

                string xmlUri = HttpContext.Current.Server.MapPath("\\XmlData\\Contacts.xml");
                string xslUri = HttpContext.Current.Server.MapPath("\\XmlData\\Q2.xsl");

                using (var xmlTextReader = new XmlTextReader(xmlUri))
                {
                    var xpathDocument = new XPathDocument(xmlTextReader);
                    var xslTransform = new XslCompiledTransform();

                    xslTransform.Load(xslUri);
                    xslTransform.Transform(xpathDocument, null, stringWriter);

                    return stringWriter.ToString();
                }
            }
        }
    }
}

HTML-Code

    var objectData; //Receives the objectified results of the JSON request.

    var xmlhttp;
    if(window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    }

    xmlhttp.open("GET", "/Q2.aspx/GetAllContacts", true);
    xmlhttp.setRequestHeader("content-type", "application/x-www-form-urlencoded");
    xmlhttp.onreadystatechange = function () 
    {
        if (xmlhttp.readyState == 4) 
        {
            if (xmlhttp.status == 200)
            {
                var jsonResultBuffer = xmlhttp.responseText;
                objectData = eval(jsonResultBuffer);
                DisplayTable();
            }
        }
    };
    xmlhttp.send(null);

    function DisplayTable()
    {       
        var sHtml = "";     
        sHtml = "<table><tr><th>ID</th><th>First</th><th>Last</th><th>Address</th></tr>";           
        for(i = 0; i < objectData.length; i++)
        {
            sHtml += "<tr>";
            sHtml += "<td>" + objectData.ID;
            sHtml += "<td>" + objectData.firstName + "</td>";
            sHtml += "<td>" + objectData.lastName + "</td>";
            sHtml += "<td>" + objectData.address + "</td>"; 
            sHtml += "</tr>"
        }
        sHtml += "</table>"         
        document.getElementById("divTable").innerHTML = sHtml;
    }    
</script>

Dev-Umgebung Details

  • Vista Ultimate SP 2
  • Visual Studio 2008
  • .NET Framework 3.5
  • Lösung noch nicht bereitgestellt, so läuft es in den "local Web server"
    von Visual Studio bereitgestellt. (Wundert mich, wenn ich sollte nicht nur IIS bereitstellen
    unter Windows Vista.)
  • Beachten Sie, dass die ASPX-Seite mit dem WebMethod-und der HTML-Seite befinden
    die gleiche Lösung.
Ich bin mir nicht sicher, aber ich denke, asp.net web-service aufgerufen werden, durch die Verwendung der SOAP.
Nein, Fopfong, gibt es nicht.
Mike, wo bist du hosting Ihrer web-service? Ist es installiert, ein virtuelles Verzeichnis oder eine Anwendung auf dem server? Wenn die Seite nicht verarbeiten, ASP.Net's Bearbeitung wird nicht ausgeführt. Stellen Sie sicher, dass Ihre IIS ist korrekt eingerichtet. Ich denke, es ist der Ordner, in Ihrem code lebt.
Diese Lösung wurde noch nicht implementiert, und es existiert nur auf meiner Entwicklungs-Maschine. Ich fügte hinzu, die environmnet Informationen zu den Haupt-post oben. Der WebService selbst ist in der gleichen Lösung mit der HTML-Seite. Und Dank für das betrachten dieser. Ich ziehe mir die Haare aus!
Haben Sie versucht, zu sehen, wenn Sie jQuery verwenden, um das für Sie übernehmen? (Nur als test, nicht als Lösung) Eine einfachere Umsetzung kann mit Hilfe der AutocompleteExtender aus dem Ajax-ToolKit. Gerade versucht zu etablieren, wenn wir kommunizieren können, über keine Mittel

InformationsquelleAutor Mike Hofer | 2010-06-22

Schreibe einen Kommentar