I’m trying to run an AJAX
Webservice
request on a VB ASP.NET page.
When the page loads, I’m trying to call the webservice but I get a 500
error in the console.
My WebService file looks like this:
<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
My ASP.NET page looks like this:
<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>
I expect the page to load and a message box to popup server side that says ‘hello_world’ as well as the web browser to create a popup that says the same. However, this does not happen as I get a 500 error instead.
I’ve tried to fix this by using different versions of jQuery
as well as enabling requests in the web.config
file like this:
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
This doesn’t work and I still get that “the server responded with a status of 500” in the web browser console. No errors are logged within the application’s debug console.
How can I fix this?
Advertisement
Answer
Ok, assuming both pages are in the SAME folder – at the same level?
Then this should work:
<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>
Note how your data has to match your parmaters..
So, say you have this:
<WebMethod()>
Public Function saydata(abc As String, def as string) as string
MsgBox(abc)
Return abc & " " & def
End Function
And note how we set the function as string – you should give the function a type – in this case “string”.
<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>
Edit:
Follow up question was how to return more then one value?
Well, the easy way? Create a structure or class – let the built in serialization convert that to a json string for you.
So our web method could say be this:
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
I often use a struct in place of a class – since then I just shove it in right before my web method as per above.
Now, lets drop in a button on the page – and js function to call this:
eg:
<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)
}
});
}
And when we run, we get/see this:
So, you can often just return a simple string. But, if you create a structure server side, then you can quite much reference the result client side as a js object as per above.