1,客户端访问WebService基础
?? 步骤:新建一个普通的webService
?? ? ? ? ? ?为webService类添加自定义标记属性[ScriptService]Attibute
?? ? ? ? ? ?释放webService方法 ?a,访问级别public;?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?b,给方法添加[WebMethod]Attribute
?? ? ? ? ? ?为页面中的ScriptManager或者ScriptManagerProxy注册webService
?? 客户端代码方法webService方法:
?? ? ? ? ? 如果webService的代码类有命名空间,命名空间下的类的名字的方法名字
?? ? ? ? ? 1,[NameSpaceName].ClassName.MethodName() ??
?? ? ? ? ? 2,依次传入参数
?? ? ? ? ? 3,传入一个方法作为成功后的回调函数
?? ? ? ? ? 4,即时没有返回值,也会调用回调函数
???
下面是简单的例子:
webService中的内容
-
using?System;
-
using?System.Collections;
-
using?System.ComponentModel;
-
using?System.Data;
-
using?System.Web;
-
using?System.Web.Services;
-
using?System.Web.Services.Protocols;
-
namespace?AJAXEnabledWebApplication2
- {
-
????
-
????
-
????
-
????[WebService(Namespace?=?"http://tempuri.org/")]
- ????[WebServiceBinding(ConformsTo?=?WsiProfiles.BasicProfile1_1)]
-
????[ToolboxItem(false)]
-
????
- ????[System.Web.Script.Services.ScriptService]
-
????public?class?WebService1?:?System.Web.Services.WebService
- ????{
-
????????
- ????????[WebMethod]
-
????????public?int?GetRandom()
- ????????{
-
????????????return?new?Random(DateTime.Now.Millisecond).Next();
- ????????}
- ????????[WebMethod]
-
????????public?int?GetRandomBetween(int?min,?int?max)
- ????????{
-
????????????return?new?Random(DateTime.Now.Millisecond).Next(min,?max);
- ????????}
- ????????[WebMethod]
-
????????public?void?Test()
- ????????{
- ????????}
- ????}
- }
页面中的内容 :
-
<%@?Page?Language="C#"?AutoEventWireup="true"?CodeBehind="Default.aspx.cs"?Inherits="AJAXEnabledWebApplication2._Default"?%>
-
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<html?xmlns="http://www.w3.org/1999/xhtml"?>
-
<head?runat="server">
-
????<title>Untitled?Page</title>
-
</head>
-
<body>
-
????<form?id="form1"?runat="server">
-
??????
-
????????<asp:ScriptManager?ID="ScriptManager1"?runat="server"?>
-
????????<Services>
-
????????<asp:ServiceReference?Path="WebService1.asmx"?InlineScript="true"?/>
-
????????</Services>
-
????????</asp:ScriptManager>
-
????????<div>
-
????????<input?type="button"?value="无返回值"?onclick="test()"?/>
-
????????<input?type="button"?value="无参数返回一个随机数字"?onclick="GetRandom()"?/>
-
????????<input?type="button"?value="返回一个0到100之间的随机数字"?onclick="GetRandom(0,100)"?/>
-
????????<script?type="text/javascript"?language="javascript">
- ????????
- ????????function?GetRandom(max,min){
- ????????//js函数默认的属性,argument?参数信息,一种js重载的实现方法
- ???????????if(arguments.length!=2){
- ????????????????AJAXEnabledWebApplication2.WebService1.GetRandom(successed);
- ????????????}
- ????????????else{
- ?????????????????AJAXEnabledWebApplication2.WebService1.GetRandomBetween(max,min,successed);
- ????????????}
- ????????}
- ????????function?test(){
- ???????????//无返回值,回调函数会弹出个null值
- ????????????AJAXEnabledWebApplication2.WebService1.Test(successed);
- ????????}
- ????????function?successed(result){
- ????????????alert(result);
- ????????}
-
????????</script>
-
????????</div>
-
????</form>
-
</body>
-
</html>
2,客户端访问PageMethod基础
服务器端步骤:客户端对应的服务器段的aspx页面中定义
?? ? ? ? ? ? ? ? ? ? 公开的静态方法
?? ? ? ? ? ? ? ? ? ? 方法上面使用[WebMethod]Attribute
?? ? ? ? ? ? ? ? ? ? ScriptManager的EnablePageMethod属性为true
客户端方法:通过PageMethods.MethodName()方法访问
简单例子:?
后台类:
-
using?System;
-
using?System.Collections;
-
using?System.Configuration;
-
using?System.Data;
-
using?System.Web;
-
using?System.Web.Security;
-
using?System.Web.UI;
-
using?System.Web.UI.HtmlControls;
-
using?System.Web.UI.WebControls;
-
using?System.Web.UI.WebControls.WebParts;
-
namespace?AJAXEnabledWebApplication2
- {
-
????public?partial?class?WebForm1?:?System.Web.UI.Page
- ????{
-
????????protected?void?Page_Load(object?sender,?EventArgs?e)
- ????????{
- ????????}
-
????????
- ????????[System.Web.Services.WebMethod]
-
????????
-
????????public?static?DateTime?GetDateTimeNow()
- ????????{
-
????????????return?DateTime.UtcNow;
- ????????}
- ????}
- }
页面代码:
-
<%@?Page?Language="C#"?AutoEventWireup="true"?CodeBehind="WebForm1.aspx.cs"?Inherits="AJAXEnabledWebApplication2.WebForm1"?%>
-
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<html?xmlns="http://www.w3.org/1999/xhtml"?>
-
<head?runat="server">
-
????<title>无标题页</title>
-
</head>
-
<body>
-
????<form?id="form1"?runat="server">
-
????<!---ScriptManager的?EnablePageMethods="true"->
-
????<asp:ScriptManager?ID="ScriptManager1"?runat="server"?EnablePageMethods="true">
-
????</asp:ScriptManager>
-
????<input?type="button"?value="调用pageMethod方法"?onclick="GetDateTimeNow()"?/>
-
????<script?type="text/javascript"?language="javascript">
- ????function?GetDateTimeNow(){
- ????//PageMethods.释放的方法名字
- ???????PageMethods.GetDateTimeNow(seccessed);
- ????}
- ????function?seccessed(result){
- ????????alert(result);
- ????}
-
????</script>
-
????</form>
-
</body>
-
</html>
3,错误处理
?? ? ? ? ?客户端调用错误处理时候可以提供一个额外的错误的回调函数
?? ? ? ? ?错误包括超时和服务器抛出的异常
?? ? ? ? ?超时只能设置在webService级别或者pageMetehod对象上 无法在方法调用时候设置
?错误信息类:Sys.Net.WebServicError
?? ? ? ? ? ? ? ? ?Sys.Net.WebServicError类提供了 timeout ?,message,exceptionType,stackTrace 4个属性
例子:
webService代码:
-
using?System;
-
using?System.Collections;
-
using?System.ComponentModel;
-
using?System.Data;
-
using?System.Web;
-
using?System.Web.Services;
-
using?System.Web.Services.Protocols;
-
namespace?AJAXEnabledWebApplication2
- {
-
????
-
????
-
????
-
????[WebService(Namespace?=?"http://tempuri.org/")]
- ????[WebServiceBinding(ConformsTo?=?WsiProfiles.BasicProfile1_1)]
-
????[ToolboxItem(false)]
- ????[System.Web.Script.Services.ScriptService]
-
????public?class?Error?:?System.Web.Services.WebService
- ????{
- ????????[WebMethod]
-
????????public?int?GetDivsion(int?a,?int?b)
- ????????{
-
????????????return?a?/?b;
- ????????}
- ????????[WebMethod]
-
????????public?int?Timeout()
- ????????{
-
????????????
- ????????????System.Threading.Thread.Sleep(5000);
-
????????????return?0;
- ????????}
- ????}
- }
页面代码:
-
<%@?Page?Language="C#"?AutoEventWireup="true"?CodeBehind="WebForm2.aspx.cs"?Inherits="AJAXEnabledWebApplication2.WebForm2"?%>
-
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<html?xmlns="http://www.w3.org/1999/xhtml"?>
-
<head?runat="server">
-
????<title>无标题页</title>
-
</head>
-
<body>
-
????<form?id="form1"?runat="server">
-
????<asp:ScriptManager?ID="ScriptManager1"?runat="server">
-
????<Services>
-
????<asp:ServiceReference?Path="Error.asmx"?/>
-
????</Services>
-
????</asp:ScriptManager>
-
????<input?id="Button1"?type="button"?value="调用一个除零函数抛出异常"?onclick="getDivsion(4,0)"?/>
-
??????<input?id="Button2"?type="button"?value="调用一个除非零函数得到结果"?onclick="getDivsion(4,4)"?/>
-
????<input?id="Button3"?type="button"?value="触发一个超时的错误"?onclick="getTimeout()"?/>
-
????<script?type="text/javascript"?language="javascript">
- ????function?getDivsion(a,b){
- ????????//参数后跟成功后的回调函数,和错误的回调函数?
- ????????AJAXEnabledWebApplication2.Error.GetDivsion(a,b,seccessed,failed);
- ?????
- ??????
- ????}
- ????function?getTimeout(){
- ????//这里设置等待服务器多久还没有返回数据?就给客户端提醒超时了?服务器中设置了5秒,等俩秒后会返回超时,如果设置为6000则正常返回1
- ????????AJAXEnabledWebApplication2.Error.set_timeout(2000);
- ????????AJAXEnabledWebApplication2.Error.Timeout(seccessed,failed);
- ????}
- ???????//调用成功的回调函数
- ???function?seccessed(result){
- ????????????alert(result);
- ????????}
- ????????//调用失败的回调函数
- ?????function?failed(error){
-
????????????var?message=String.format("Timeout:{0}/n?Message:{1}/n?exceptionType:{2}/n?stackTrace:{3}",
- ????????????error.get_timedOut(),
- ????????????error.get_message(),
- ????????????error.get_exceptionType(),
- ????????????error.get_stackTrace()
- ????????????);
- ????????????alert(message);
- ????????}
- ????
-
????</script>
-
????</form>
-
</body>
-
</html>
4,复杂数据类型使用基础
调用的时候有时候我们需要调用一些复杂的自定义的数据类型,
1,定义了自己的数据类型时候,类型的一些共有属性和字段都被释放(返回值)和接受(参数)
2,容器对象
?? ? --实现了 IList接口的对象
?? ? --实现了IDictionary接口的对象 (客户端是用一个对象来模拟字典的,所以字典数据中的key必须是string类型)
例子:
自定义类:
-
using?System;
-
using?System.Data;
-
using?System.Configuration;
-
using?System.Web;
-
using?System.Web.Security;
-
using?System.Web.UI;
-
using?System.Web.UI.HtmlControls;
-
using?System.Web.UI.WebControls;
-
using?System.Web.UI.WebControls.WebParts;
-
namespace?AJAXEnabledWebApplication2
- {
-
????public?class?Person
- ????{
-
????????public?string?firstName;
-
????????public?string?lastName;
-
????????public?int?age;
-
????????public?string?FullName
- ????????{
-
????????????get
- ????????????{
-
????????????????return?firstName?+?"?"?+?lastName;
- ????????????}
- ????????}
-
????????public??override?string??ToString()
- ????????{
-
????????????return?"Name:"+this.FullName+"?Age:"+age.ToString();
- ????????}
- ????}
- }
webService:
-
using?System;
-
using?System.Collections;
-
using?System.ComponentModel;
-
using?System.Data;
-
using?System.Web;
-
using?System.Web.Services;
-
using?System.Web.Services.Protocols;
-
namespace?AJAXEnabledWebApplication2
- {
-
????
-
????
-
????
-
????[WebService(Namespace?=?"http://tempuri.org/")]
- ????[WebServiceBinding(ConformsTo?=?WsiProfiles.BasicProfile1_1)]
-
????[ToolboxItem(false)]
- ????[System.Web.Script.Services.ScriptService]
-
????public?class?WebService2?:?System.Web.Services.WebService
- ????{
- ????????[WebMethod]
-
????????
-
????????public?Person?AddAge(Person?p)
- ????????{
- ????????????p.age?+=?1;
-
????????????return?p;
- ????????}
- ????????[WebMethod]
-
????????
-
????????public?System.Collections.Generic.List<int>?Reverse(System.Collections.Generic.List<int>?list)
- ????????{
-
????????????
- ????????????list.Reverse();
-
????????????return?list;
- ????????}
- ????????[WebMethod]
-
????????
-
????????public?System.Collections.Generic.IDictionary<string,?Person>?GetPersons()
- ????????{
-
????????????System.Collections.Generic.Dictionary<string,?Person>?result?=?new?System.Collections.Generic.Dictionary<string,?Person>();
-
????????????Person?p1?=?new?Person();
-
????????????Person?p2?=?new?Person();
-
????????????p1.firstName?=?"Si";
-
????????????p1.lastName?=?"Li";
- ????????????p1.age?=?23;
- ????????????result[p1.FullName]?=?p1;
- ????????????p2.age?=?25;
-
????????????p2.firstName?=?"Wu";
-
????????????p2.lastName?=?"Wang";
- ????????????result[p2.FullName]?=?p2;
-
????????????return?result;
- ????????}
- ????}
- }
aspx页面
-
<%@?Page?Language="C#"?AutoEventWireup="true"?CodeBehind="WebForm3.aspx.cs"?Inherits="AJAXEnabledWebApplication2.WebForm3"?%>
-
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<html?xmlns="http://www.w3.org/1999/xhtml"?>
-
<head?runat="server">
-
????<title>无标题页</title>
-
</head>
-
<body>
-
????<form?id="form1"?runat="server">
-
????<asp:ScriptManager?ID="ScriptManager1"?runat="server">
-
????<Services>
-
????<asp:ServiceReference?Path="WebService2.asmx"?/>
-
????</Services>
-
????</asp:ScriptManager>
-
????<input?id="Button1"?type="button"?value="年龄增加一岁"?onclick="AddAge()"?/>
-
????<input?id="Button2"?type="button"?value="反转数组[1,2,3,4,5,6s]"?onclick="revers([1,6])"?/>
-
????<input?id="Button3"?type="button"?value="返回一个数据字典数据"?onclick="getPersons()"?/>
-
????<script?language="javascript"?type="text/javascript">
- ????//年龄增加一岁
- ????function?AddAge(){
-
????????var?person=new?Object();
-
???????person.firstName="Stone";
-
???????person.lastName="Zhang";
-
???????person.age=23;
- ???????//调用webservice中的年龄增加一岁的方法?
- ???????AJAXEnabledWebApplication2.WebService2.AddAge(person,AddAgeseccessed);
- ????}
- ????function?AddAgeseccessed(result){
- ????????//结果是24
-
????????var?message=String.format("FirstName:{0}/n?LastName:{1}/nFullName:{2}/nAge:{3}",
- ????????result.firstName,
- ????????result.lastName,
- ????????result.FullName,
- ????????result.age
- ????????);
- ?????????alert(message);
- ????}
- ????//数组
- ????function?revers(array){
- ?????AJAXEnabledWebApplication2.WebService2.Reverse(array,seccessed);
- ????}
- ????function?seccessed(result){
- ????????alert(result);
- ????}
- ????//数据字典
- ????
- ????function?getPersons(){
- ?????????AJAXEnabledWebApplication2.WebService2.GetPersons(getPersonsSeccssed);
- ????}
- ????function?getPersonsSeccssed(result){
- ????//枚举字典中的每一项
- ????//这里得不到字典对象中的方法
- ????????for(var?key?in?result){
- ????????????alert(key+":?"+result[key].age);
- ????????}
- ????}
-
????</script>
-
????</form>
-
</body>
-
</html>
5,客户端代理使用基础
客户端函数调用完整签名:
?? ?Invoke(arg1,...,argN,onSucceeded,onFailed,userContext)
?? ?参数,成功时的回调函数,出错后的回调函数,userContext为任意的自定义类型(可以传入数据字典)
回调函数完整签名:
?? ?onSucceeded(result,userContext,methodName)
?? ?结果,调用函数传入的userContext
?? ?onFailed(error,methodName)
?? ? error对象
?webservice级别默认属性:
??-timeout 比较常用
??-defaultUserContext
??-defaultSucceededCallBack
??-defaultFailedCallBack 比较常用,出错后调用统一的webservice中默认的
例子:
webservice代码用了上面用过的一个webservice:
-
using?System;
-
using?System.Collections;
-
using?System.ComponentModel;
-
using?System.Data;
-
using?System.Web;
-
using?System.Web.Services;
-
using?System.Web.Services.Protocols;
-
namespace?AJAXEnabledWebApplication2
- {
-
????
-
????
-
????
-
????[WebService(Namespace?=?"http://tempuri.org/")]
- ????[WebServiceBinding(ConformsTo?=?WsiProfiles.BasicProfile1_1)]
-
????[ToolboxItem(false)]
- ????[System.Web.Script.Services.ScriptService]
-
????public?class?Error?:?System.Web.Services.WebService
- ????{
- ????????[WebMethod]
-
????????public?int?GetDivsion(int?a,?int?b)
- ????????{
-
????????????return?a?/?b;
- ????????}
- ????????[WebMethod]
-
????????public?int?Timeout()
- ????????{
-
????????????
- ????????????System.Threading.Thread.Sleep(5000);
-
????????????return?0;
- ????????}
- ????}
- }
asp页面代码:
-
<%@?Page?Language="C#"?AutoEventWireup="true"?CodeBehind="WebForm4.aspx.cs"?Inherits="AJAXEnabledWebApplication2.WebForm4"?%>
-
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<html?xmlns="http://www.w3.org/1999/xhtml"?>
-
<head?runat="server">
- ????<title>无标题页</title>
- </head>
- <body>
-
????<form?id="form1"?runat="server">
-
?????<asp:ScriptManager?ID="ScriptManager1"?runat="server">
- ????<Services>
-
????<asp:ServiceReference?Path="Error.asmx"?/>
- ????</Services>
- ????</asp:ScriptManager>
-
????<input?id="Button1"?type="button"?value="调用一个除零函数抛出异常"?onclick="getDivsion(4,0)"?/>
-
??????<input?id="Button2"?type="button"?value="调用一个除非零函数得到结果"?onclick="getDivsion(4,4)"?/>
-
????<input?id="Button3"?type="button"?value="触发一个超时的错误"?onclick="getTimeout()"?/>
-
????<script?type="text/javascript"?language="javascript">
-
????
- ????AJAXEnabledWebApplication2.Error.set_defaultFailedCallback(failed);
- ????AJAXEnabledWebApplication2.Error.set_timeout(2000);
- ????function?getDivsion(a,b){
-
????????
-
???????
-
???????
- ???????AJAXEnabledWebApplication2.Error.GetDivsion(a,seccessed);
- ?????
- ??????
- ????}
- ????function?getTimeout(){
-
????
-
??????
-
??????
- ??????AJAXEnabledWebApplication2.Error.Timeout(seccessed);
- ????}
-
???????
- ???function?seccessed(result){
- ????????????alert(result);
- ????????}
-
????????
- ?????function?failed(error){
-
????????????var?message=String.format("Timeout:{0}/n?Message:{1}/n?exceptionType:{2}/n?stackTrace:{3}",
- ????????????error.get_stackTrace()
- ????????????);
- ????????????alert(message);
- ????????}
- ????
- ????</script>
- ????</form>
- </body>
- </html>
目前就了解了这些总结下~