Вызов WebMethods с помощью XmlHttpRequest и Pure JavaScript - PullRequest
1 голос
/ 22 июня 2010

У меня есть то, что должно быть относительно простым заданием, которое, честно говоря, поставило меня в тупик. Я исследовал его до тех пор, пока у меня не зажегся мозг, и теперь я задыхаюсь и прошу вас, ребята, о помощи

Вот сценарий:

  • У меня есть страница 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, находится внутри то же решение.

Ответы [ 2 ]

3 голосов
/ 26 июня 2012

Я думаю, что нам нужно вызвать веб-метод с помощью запроса POST, попробуйте изменить эту часть кода

xmlhttp.open("POST", "/Q2.aspx/GetAllContacts", true);
xmlhttp.setRequestHeader("content-type", "application/json");
xmlhttp.setRequestHeader("Accept", "application/json");
xmlhttp.onreadystatechange = function () 
{
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
    {
            var jsonResultBuffer = JSON.parse(xmlhttp.responseText);
            objectData = jsonResultBuffer.d;
            DisplayTable();
    }
};

Ответ возвращается в формате JSON с ключом "d" в xmlhttp.responseText

0 голосов
/ 25 июня 2010

Пожалуйста, попробуйте следующее, используя jquery, чтобы увидеть, доступен веб-сервис или нет.

$.ajax({
        type: "POST",
        url: "Q2.aspx/GetAllContacts",
        data: "",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(response) {
           alert("success");
        },
        error: function(response, aa) {
            alert("fail");
        }
    });

Thurein

...