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
, undScriptService
Attribute. - Diese Seite enthält eine Methode, die
GetAllContacts
, dekoriert ist, mit derWebMethod
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 desGetAllContacts
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ürHttpGet
undHttpPut
imWebServices
Abschnitt unterSystem.Web.webServices
. - Ich habe überprüft, dass mein
Web.Config
- Datei enthält dieScriptModule
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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Pls versuchen Sie die folgenden using-jquery zu sehen, die web-service zugänglich ist oder nicht.
Thurein
InformationsquelleAutor Thurein
Ich denke, wir müssen zum Aufruf der web-Methode mit POST-Anforderung
versuchen Sie, diesen Teil des Codes
Antwort zurückgegeben wird im JSON-format mit "d", wie Sie den Schlüssel im xmlhttp.responseText
InformationsquelleAutor khagesh