使用XmlHttpRequest和Pure JavaScript调用WebMethods

时间:2010-06-22 03:17:24

标签: javascript asp.net ajax xmlhttprequest webmethod

我有一个相对简单的任务,坦率地让我难过。我一直在研究它,直到我的大脑被炸,现在我正在撑船,并请求你们帮忙。

以下是该方案:

  • 我有一个用WebService修饰的ASPX页面(Q2.aspx), WebServiceBindingScriptService属性。
  • 该页面包含一个用GetAllContacts修饰的方法WebMethod attribute并返回包含JSON数据的字符串。 (对于它的价值,页面 本身不包含其他控件或功能。)
  • 我有一个HTML页面,其中包含使用XmlHttpRequest的JavaScript 对象在ASPX页面上调用GetAllContacts WebMethod并进行转换 将JSON数据转换为HTML表。
  • 我已经验证我的Web.Config文件包含适当的协议处理程序 HttpGet下的HttpPut部分中的WebServicesSystem.Web.webServices
  • 我已验证我的Web.Config文件包含ScriptModule条目 System.webServer.modules部分,并且与相应的文档相符。

但是,当我在浏览器中查看HTML页面时,会发生以下情况:

  • Web请求通过,但结果是来自ASPX页面的未处理HTML。
  • 永远不会调用GetAllContacts方法,可以通过在代码中设置断点来证明。
  • 但是,调用了调用Web服务的代码和JavaScript回调 正确调用在请求完成时调用的函数。

似乎JavaScript代码在很大程度上是正确设置的,但由于某种原因,此时完全逃避了我,HTML页面将不会在ASPX页面上执行WebMethod,而只是返回页面好像是一个简单的HTML GET请求。很明显,JavaScript的eval函数无法评估HTML文档,这让我遇到了问题。 (另请注意,JSON数据在返回的HTML中无处可见。)

坦率地说,我很困惑。我查看过几十篇微软文章,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>

         

开发环境详细信息

  • Vista Ultimate SP 2
  • Visual Studio 2008
  • .NET Framework 3.5
  • 尚未部署解决方案,因此它正在“本地Web服务器”中运行 由Visual Studio提供。 (让我想知道我是否应该只部署IIS 在Vista下。)
  • 请注意,包含WebMethod和HTML页面的ASPX页面位于其中 同样的解决方案。

2 个答案:

答案 0 :(得分:3)

我认为我们需要使用POST请求调用web方法 尝试更改此部分代码

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中的键

答案 1 :(得分:0)

请使用jquery尝试以下操作,以查看是否可以访问Web服务。

$.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