У меня есть то, что должно быть относительно простым заданием, которое, честно говоря, поставило меня в тупик. Я исследовал его до тех пор, пока у меня не зажегся мозг, и теперь я задыхаюсь и прошу вас, ребята, о помощи
Вот сценарий:
- У меня есть страница 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 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>
Подробности среды разработки
- Vista Ultimate SP 2
- Visual Studio 2008
- .NET Framework 3.5
- Решение еще не развернуто, поэтому оно работает на "локальном веб-сервере"
предоставлено Visual Studio. (Заставляет меня задуматься, не следует ли мне просто развернуть IIS
под Vista.)
- Обратите внимание, что страница ASPX, содержащая WebMethod и страницу HTML, находится внутри
то же решение.