我正在尝试在 VB ASP.NET 页面上运行
AJAX
Webservice
请求。
页面加载时,我尝试调用 Web 服务,但在控制台中收到
500
错误。
我的 WebService 文件如下所示:
<System.Web.Script.Services.ScriptService()>
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")>
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)>
<ToolboxItem(False)>
Public Class usrDataSave
Inherits System.Web.Services.WebService
<WebMethod()>
Public Function saydata(abc As String)
MsgBox(abc)
Return abc
End Function
我的 ASP.NET 页面如下所示:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$.ajax({
type: "POST",
url: "usrDataSave.asmx/saydata",
data: "hello_world",
contentType: "application/json",
datatype: "json",
success: function(responseFromServer) {
alert(responseFromServer.d)
}
});
});
</script>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
我希望加载页面并弹出一个消息框,服务器端显示“hello_world”,并且网络浏览器创建一个弹出窗口,显示相同的内容。但是,这并没有发生,因为我收到了 500 错误。
我尝试通过使用不同版本的
jQuery
以及在 web.config
文件中启用请求来解决此问题,如下所示:
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
这不起作用,我仍然在 Web 浏览器控制台中看到“服务器响应状态为 500”。应用程序的调试控制台中不会记录任何错误。
我该如何解决这个问题?
我假设两个页面都位于同一文件夹中,处于同一级别。
那么这应该有效:
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
type: "POST",
url: usrDataSave.asmx/saydata
data: "{abc: 'hello_world'}",
contentType: "application/json",
datatype: "json",
success: function (responseFromServer) {
alert(responseFromServer.d)
}
});
});
</script>
注意您的数据必须如何与您的参数相匹配。
所以,假设你有这个:
<WebMethod()>
Public Function saydata(abc As String, def as string) as string
MsgBox(abc)
Return abc & " " & def
End Function
并注意我们如何将函数设置为字符串 - 您应该为函数指定一个类型 - 在本例中为“字符串”:
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
type: "POST",
url: "WebService1.asmx/saydata",
data: "{abc: 'hello', def: 'world'}",
contentType: "application/json",
datatype: "json",
success: function (responseFromServer) {
alert(responseFromServer.d)
}
});
});
</script>
后续问题是如何返回多个值。
嗯,最简单的方法是创建一个结构或类,然后让内置序列化将其转换为 JSON 字符串。
所以我们的网络方法可以说是这样的:
Structure Hotel
Dim FirstName As String
Dim LastName As String
Dim HotelName As String
End Structure
<WebMethod()>
Public Function GetHotel() As Hotel
Dim MyHotel As New Hotel
MyHotel.FirstName = "Albert"
MyHotel.LastName = "Kallal"
MyHotel.HotelName = "Banff Springs Hotel"
Return MyHotel
End Function
我经常使用结构体代替类 - 从那以后我只是按照上面的方法将它推到我的 Web 方法之前。
现在,让我们在页面上放置一个按钮 - 和 JS 函数来调用它:
<asp:Button ID="cmdHotel" runat="server" Text="Get Hotel"
OnClientClick="GetHotel();return false;" />
<script>
function GetHotel() {
$.ajax({
type: "POST",
url: "WebService1.asmx/GetHotel",
data: "{}",
contentType: "application/json",
datatype: "json",
success: function (r) {
s = "FirstName = " + r.d.FirstName + "\n"
s = s + "LastName = " + r.d.LastName + "\n"
s = s + "Hotel Name = " + r.d.HotelName
alert(s)
}
});
}
当我们跑步时,我们得到这个:
因此,您通常可以只返回一个简单的字符串。但是,如果您创建一个结构服务器端,那么您可以按照上面的方式将结果客户端作为 JS 对象引用。