У меня есть то, что должно быть относительно простой задачей, которая, откровенно говоря, меня озадачила. Я исследовал его, пока мой мозг не обжарился, и теперь я пинаю и прошу вас, ребята, о помощи.Вызов WebMethods с XmlHttpRequest и чистым JavaScript
Вот сценарий:
- У меня есть страницы ASPX (Q2.aspx), который украшен с
WebService
,WebServiceBinding
иScriptService
атрибуты. - Эта страница содержит метод,
GetAllContacts
, который украшен атрибутомWebMethod
и возвращает строку, содержащую данные JSON. (Для чего это стоит, страница сама не содержит других элементов управления и функциональных возможностей.) - У меня есть страница HTML, которая содержит JavaScript, который использует
XmlHttpRequest
объект для вызоваGetAllContacts
WebMethod на странице ASPX и преобразование данных в формате JSON в таблицу HTML. - Я проверил, что мой
Web.Config
файл содержит соответствующие обработчики протокола дляHttpGet
иHttpPut
в разделеWebServices
подSystem.Web.webServices
. - Я подтвердил, что мой файл
Web.Config
содержит записьScriptModule
под заголовкомSystem.webServer.modules
и что она соответствует соответствующей документации.
Однако при просмотре страницы HTML в браузере происходит следующее:
- запрос Веб проходит, но результаты для необработанного HTML со страницы ASPX.
- Метод
GetAllContacts
никогда не вызывается, о чем свидетельствует установка точки останова в коде. - Вызывается код для вызова веб-службы, и функция обратного вызова JavaScript , которая вызывается при завершении запроса, правильно вызывается.
Оказывается, что код JavaScript в основном настроен правильно, но по какой-то причине, что полностью отводящей меня в этот момент, страница HTML не будет просто выполнить WebMethod
на странице ASPX, а просто возвращает страницу как будто это был простой запрос HTML GET
. Очевидно, что HTML-документ не может быть оценен функцией JavaScript eval
, что приводит меня к моей проблеме. (Также обратите внимание, что данные JSON не отображаются нигде в возвращенном HTML-файле.)
Я, откровенно говоря, озадачен. Я просмотрел десятки статей Microsoft, статей StackOverflow, статей CodeProject и кто знает, что еще. Мой код выглядит, как будто все в порядке. Но я знаю лучше. Мне не хватает чего-то простого, глупого и очевидного. Мне просто нужно, чтобы кто-то указал мне на это.
Ниже вы найдете код страницы ASPX и код HTML, в надежде, что они прольют некоторый свет.
ASPX Код
<%@ 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 код
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 окружающей среды Детали
- Vista Ultimate SP 2
- Visual Studio 2008
- .NET Framework 3.5
- Решение еще не развернуты, поэтому он работает в «локальной сети сервер " предоставляется Visual Studio. (Заставляет меня задаться вопросом, не следует ли мне просто развернуть IIS под Vista.)
- Обратите внимание, что страница ASPX, содержащая WebMethod и HTML-страницу, находится в пределах того же решения.
Я не уверен, но я думаю, что веб-сервис asp.net должен вызываться с помощью SOAP. – Fopfong
Нет, Fopfong, это не так. – TheGeekYouNeed
Майк, где вы размещаете свой веб-сервис? Он установлен в виртуальном каталоге или в качестве приложения на сервере? Если страница не обрабатывается, обработка ASP.Net не выполняется. Убедитесь, что ваш IIS настроен правильно. Я бы предположил, что это папка, в которой живет ваш код. – TheGeekYouNeed