之前学习aps.net的时候学习过使用服务器端去访问webservice的方法,当时实现了一个例子:web server模拟网上购物,今天学习asp.net ajax的时候学习到了客户端直接访问webserivice的方式。这种客户端直接访问webserver的方式体现了ajax的异步刷新数据的思想。
客户端访问webservice基础
webservice端的创建步骤:
1.创建一个aps.net webservice
2.加入标记[scriptService]
3.写webservice的方法,并加入标记[webMethod]进行释放服务器方法
客户端访问webservice的步骤
1.在插入的的scrptmanager引入asmx文件。
2.传入参数
3.写一个方法作为成功的回调函数。
4.也可以写一个错误处理作为失败的回调函数。
下面是自己写的一个小例子:大概需求是在客户端输入两个数,去调用webservic端的除法的方法,如果成功输出运行结果,如果错误输入输出错误的具体内容。(特别简单)
webservic端
public class divsion : System.Web.Services.WebService
{
[WebMethod]
public int getDivison(int a, int b)//除法运算
{
return a / b;
}
[WebMethod]
public int timeOut()
{
Thread.Sleep(5000); //设置睡眠时间
return 0;
}
}
客户端
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="divsion.asmx" />
</Services>
</asp:ScriptManager>
<script language="javascript" type="text/javascript">
//提供默认的错误处理回调函数,这个函数是在后面的所有的方法加载之后,才开始调用这个函数,所以,failedCallback的生命起始于最后的
//WebApplication1.divsion.set_defaultFailedCallback(failedCallback);
//设置为1秒后超时
WebApplication1.divsion.set_timeout(1000);
function getDivsion()
{
var a = document.getElementById("Text1").value;
var b = document.getElementById("Text2").value;
WebApplication1.divsion.getDivison(a,b,getSuccess,getFailed);
}
function getSuccess(result) //成功后回调函数
{
alert(result);
}
function getFailed(error) //错误处理
{
var message = String.format(
"Timeout: {0}\nMessage: {1}\nExceptionType: {2}\nStackTrace: {3}",
error.get_timedOut(),
error.get_message(),
error.get_exceptionType(),
error.get_stackTrace());
alert(message);
}
</script>
</div>
</form>
<input id="Text1" type="text" />
除以
<input id="Text2" type="text" />
<input id="Button1" type="button" value="等于" οnclick="getDivsion()"/>
</body>
运行结果
输入两个整数的时候:
除数为0的时候:会抛出错误处理
客户端访问pageMethod基础
这种方式与前一种的不同在于:
1.这种方式只能在将调用的方法,放到服务器端(aspx的后台代码)。
2.只能公开静态方法,不能获取页面的具体控件内容
3.使用webmethod标记,进行释放。
客户端访问服务器端的步骤:
1.为页面引入scrptmanager,并修改srciptMangeer中设置enablepagemethods=true。
2.通过pageMethods.MethodName访问。
3.写一个方法作为成功或失败的回调函数。
下面是一个简单的小例子:大概需求是:在服务器端写入获取当前时间的方法,客户端调用这个方法。
服务器端
[WebMethod]
public static DateTime GetCurrentTime()
{
//根据客户端所在的时间来显示
return DateTime.UtcNow;
}
客户端
/head>
<body>
<form id="form1" runat="server">
<%--EnablePageMethods方法赋值不可少--%>
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
<input type="button" value="Get Current Time" οnclick="getCurrentTime()" />
<script language="javascript" type="text/javascript">
function getCurrentTime() {
//getCurrentTimeSucceeded为回调函数
PageMethods.GetCurrentTime(getCurrentTimeSucceeded);
}
function getCurrentTimeSucceeded(result)
{
alert(result);
}
</script>
</form>
</body>
客户端代理使用细节
函数调用的完整签名
Invoke(arg1,..argn,onSuccessed,onFailed,userContext)
arg1:参数
onSuccessed:成功调用的函数
onFailed:失败调用的函数,或者是错误处理的函数。
userContext:调用方法,接受方法继续处理方法,是不同的方法,所以传参就可以把传递的参数放到usercontext中
回调函数完整签名
onSuccessed/onFailed(result,UserContext,methodName)
WebService级别默认属性
Timeout:超时
Defaultusercontext:默认的usercontextDefaultsuccessededcallback:默认成功回调函数
Defaultfailedcallback:默认的错误处理方法
总结:
这一部分刚刚开始学习,学起来有点慢,但是对这一块自己还是有很大的兴趣的,因为异步传输确实是提高了效率很强大。当然通过这部分的客户端访问webserivice的学习,也越来越感觉到了asp.net ajax框架的强大。