我有一个相对简单的任务,坦率地让我难过。我一直在研究它,直到我的大脑被炸,现在我正在撑船,并请求你们帮忙。
以下是该方案:
WebService
修饰的ASPX页面(Q2.aspx),
WebServiceBinding
和ScriptService
属性。 GetAllContacts
修饰的方法WebMethod
attribute并返回包含JSON数据的字符串。 (对于它的价值,页面
本身不包含其他控件或功能。)XmlHttpRequest
的JavaScript
对象在ASPX页面上调用GetAllContacts
WebMethod并进行转换
将JSON数据转换为HTML表。 Web.Config
文件包含适当的协议处理程序
HttpGet
下的HttpPut
部分中的WebServices
和System.Web.webServices
。Web.Config
文件包含ScriptModule
条目
System.webServer.modules
部分,并且与相应的文档相符。但是,当我在浏览器中查看HTML页面时,会发生以下情况:
GetAllContacts
方法,可以通过在代码中设置断点来证明。似乎JavaScript代码在很大程度上是正确设置的,但由于某种原因,此时完全逃避了我,HTML页面将不会在ASPX页面上执行WebMethod
,而只是返回页面好像是一个简单的HTML GET
请求。很明显,JavaScript的eval
函数无法评估HTML文档,这让我遇到了问题。 (另请注意,JSON数据在返回的HTML中无处可见。)
下面你会找到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>
开发环境详细信息
答案 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