客户端访问WebService(1)

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中的内容
  1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Web;
  6. using System.Web.Services;
  7. using System.Web.Services.Protocols;
  8. namespace AJAXEnabledWebApplication2
  9. {
  10.     /// <summary>
  11.     /// WebService1 的摘要说明
  12.     /// </summary>
  13.     [WebService(Namespace = "http://tempuri.org/")]
  14.     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  15.     [ToolboxItem(false)]
  16.     //为类添加自己定义属性[ScriptService]
  17.     [System.Web.Script.Services.ScriptService]
  18.     public class WebService1 : System.Web.Services.WebService
  19.     {
  20.         //释放WebService方法
  21.         [WebMethod]
  22.         public int GetRandom()
  23.         {
  24.             return new Random(DateTime.Now.Millisecond).Next();
  25.         }
  26.         [WebMethod]
  27.         public int GetRandomBetween(int min, int max)
  28.         {
  29.             return new Random(DateTime.Now.Millisecond).Next(min, max);
  30.         }
  31.         [WebMethod]
  32.         public void Test()
  33.         {
  34.         }
  35.     }
  36. }
页面中的内容 :
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AJAXEnabledWebApplication2._Default" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" >
  4. <head runat="server">
  5.     <title>Untitled Page</title>
  6. </head>
  7. <body>
  8.     <form id="form1" runat="server">
  9.       <!--InlineScript为true的时候webservice的方法生成的script代码会释放在页面中,默认为false-->
  10.         <asp:ScriptManager ID="ScriptManager1" runat="server" >
  11.         <Services>
  12.         <asp:ServiceReference Path="WebService1.asmx" InlineScript="true" />
  13.         </Services>
  14.         </asp:ScriptManager>
  15.         <div>
  16.         <input type="button" value="无返回值" onclick="test()" />
  17.         <input type="button" value="无参数返回一个随机数字" onclick="GetRandom()" />
  18.         <input type="button" value="返回一个0到100之间的随机数字" onclick="GetRandom(0,100)" />
  19.         <script type="text/javascript" language="javascript">
  20.         
  21.         function GetRandom(max,min){
  22.         //js函数默认的属性,argument 参数信息,一种js重载的实现方法
  23.            if(arguments.length!=2){
  24.                 AJAXEnabledWebApplication2.WebService1.GetRandom(successed);
  25.             }
  26.             else{
  27.                  AJAXEnabledWebApplication2.WebService1.GetRandomBetween(max,min,successed);
  28.             }
  29.         }
  30.         function test(){
  31.            //无返回值,回调函数会弹出个null值
  32.             AJAXEnabledWebApplication2.WebService1.Test(successed);
  33.         }
  34.         function successed(result){
  35.             alert(result);
  36.         }
  37.         </script>
  38.         </div>
  39.     </form>
  40. </body>
  41. </html>

2,客户端访问PageMethod基础

服务器端步骤:客户端对应的服务器段的aspx页面中定义
                     公开的静态方法
                     方法上面使用[WebMethod]Attribute
                     ScriptManager的EnablePageMethod属性为true

客户端方法:通过PageMethods.MethodName()方法访问

简单例子: 
后台类:
  1. using System;
  2. using System.Collections;
  3. using System.Configuration;
  4. using System.Data;
  5. using System.Web;
  6. using System.Web.Security;
  7. using System.Web.UI;
  8. using System.Web.UI.HtmlControls;
  9. using System.Web.UI.WebControls;
  10. using System.Web.UI.WebControls.WebParts;
  11. namespace AJAXEnabledWebApplication2
  12. {
  13.     public partial class WebForm1 : System.Web.UI.Page
  14.     {
  15.         protected void Page_Load(object sender, EventArgs e)
  16.         {
  17.         }
  18.         //向客户端释放方法
  19.         [System.Web.Services.WebMethod]
  20.         //public类型的static
  21.         public static DateTime GetDateTimeNow()
  22.         {
  23.             return DateTime.UtcNow;
  24.         }
  25.     }
  26. }
页面代码:

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="AJAXEnabledWebApplication2.WebForm1" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" >
  4. <head runat="server">
  5.     <title>无标题页</title>
  6. </head>
  7. <body>
  8.     <form id="form1" runat="server">
  9.     <!---ScriptManager的 EnablePageMethods="true"->
  10.     <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
  11.     </asp:ScriptManager>
  12.     <input type="button" value="调用pageMethod方法" onclick="GetDateTimeNow()" />
  13.     <script type="text/javascript" language="javascript">
  14.     function GetDateTimeNow(){
  15.     //PageMethods.释放的方法名字
  16.        PageMethods.GetDateTimeNow(seccessed);
  17.     }
  18.     function seccessed(result){
  19.         alert(result);
  20.     }
  21.     </script>
  22.     </form>
  23. </body>
  24. </html>
3,错误处理
          客户端调用错误处理时候可以提供一个额外的错误的回调函数
          错误包括超时和服务器抛出的异常
          超时只能设置在webService级别或者pageMetehod对象上 无法在方法调用时候设置

 错误信息类:Sys.Net.WebServicError
                  Sys.Net.WebServicError类提供了 timeout  ,message,exceptionType,stackTrace 4个属性

例子:

webService代码:

  1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Web;
  6. using System.Web.Services;
  7. using System.Web.Services.Protocols;
  8. namespace AJAXEnabledWebApplication2
  9. {
  10.     /// <summary>
  11.     /// Error 的摘要说明
  12.     /// </summary>
  13.     [WebService(Namespace = "http://tempuri.org/")]
  14.     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  15.     [ToolboxItem(false)]
  16.     [System.Web.Script.Services.ScriptService]
  17.     public class Error : System.Web.Services.WebService
  18.     {
  19.         [WebMethod]
  20.         public int GetDivsion(int a, int b)
  21.         {
  22.             return a / b;
  23.         }
  24.         [WebMethod]
  25.         public int Timeout()
  26.         {
  27.             //设置等待5秒后返回值
  28.             System.Threading.Thread.Sleep(5000);
  29.             return 0;
  30.         }
  31.     }
  32. }
页面代码:

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="AJAXEnabledWebApplication2.WebForm2" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" >
  4. <head runat="server">
  5.     <title>无标题页</title>
  6. </head>
  7. <body>
  8.     <form id="form1" runat="server">
  9.     <asp:ScriptManager ID="ScriptManager1" runat="server">
  10.     <Services>
  11.     <asp:ServiceReference Path="Error.asmx" />
  12.     </Services>
  13.     </asp:ScriptManager>
  14.     <input id="Button1" type="button" value="调用一个除零函数抛出异常" onclick="getDivsion(4,0)" />
  15.       <input id="Button2" type="button" value="调用一个除非零函数得到结果" onclick="getDivsion(4,4)" />
  16.     <input id="Button3" type="button" value="触发一个超时的错误" onclick="getTimeout()" />
  17.     <script type="text/javascript" language="javascript">
  18.     function getDivsion(a,b){
  19.         //参数后跟成功后的回调函数,和错误的回调函数 
  20.         AJAXEnabledWebApplication2.Error.GetDivsion(a,b,seccessed,failed);
  21.      
  22.       
  23.     }
  24.     function getTimeout(){
  25.     //这里设置等待服务器多久还没有返回数据 就给客户端提醒超时了 服务器中设置了5秒,等俩秒后会返回超时,如果设置为6000则正常返回1
  26.         AJAXEnabledWebApplication2.Error.set_timeout(2000);
  27.         AJAXEnabledWebApplication2.Error.Timeout(seccessed,failed);
  28.     }
  29.        //调用成功的回调函数
  30.    function seccessed(result){
  31.             alert(result);
  32.         }
  33.         //调用失败的回调函数
  34.      function failed(error){
  35.             var message=String.format("Timeout:{0}/n Message:{1}/n exceptionType:{2}/n stackTrace:{3}",
  36.             error.get_timedOut(),
  37.             error.get_message(),
  38.             error.get_exceptionType(),
  39.             error.get_stackTrace()
  40.             );
  41.             alert(message);
  42.         }
  43.     
  44.     </script>
  45.     </form>
  46. </body>
  47. </html>
4,复杂数据类型使用基础

调用的时候有时候我们需要调用一些复杂的自定义的数据类型,

1,定义了自己的数据类型时候,类型的一些共有属性和字段都被释放(返回值)和接受(参数)
2,容器对象
     --实现了 IList接口的对象
     --实现了IDictionary接口的对象 (客户端是用一个对象来模拟字典的,所以字典数据中的key必须是string类型)

例子:
自定义类:
  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.HtmlControls;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. namespace AJAXEnabledWebApplication2
  11. {
  12.     public class Person
  13.     {
  14.         public string firstName;
  15.         public string lastName;
  16.         public int age;
  17.         public string FullName
  18.         {
  19.             get
  20.             {
  21.                 return firstName + " " + lastName;
  22.             }
  23.         }
  24.         public  override string  ToString()
  25.         {
  26.             return "Name:"+this.FullName+" Age:"+age.ToString();
  27.         }
  28.     }
  29. }
webService:

  1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Web;
  6. using System.Web.Services;
  7. using System.Web.Services.Protocols;
  8. namespace AJAXEnabledWebApplication2
  9. {
  10.     /// <summary>
  11.     /// WebService2 的摘要说明
  12.     /// </summary>
  13.     [WebService(Namespace = "http://tempuri.org/")]
  14.     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  15.     [ToolboxItem(false)]
  16.     [System.Web.Script.Services.ScriptService]
  17.     public class WebService2 : System.Web.Services.WebService
  18.     {
  19.         [WebMethod]
  20.         //一个人的年龄增加了一岁
  21.         public Person AddAge(Person p)
  22.         {
  23.             p.age += 1;
  24.             return p;
  25.         }
  26.         [WebMethod]
  27.         //数组
  28.         public System.Collections.Generic.List<int> Reverse(System.Collections.Generic.List<int> list)
  29.         {
  30.             //反转数组
  31.             list.Reverse();
  32.             return list;
  33.         }
  34.         [WebMethod]
  35.         ////数据字典
  36.         public System.Collections.Generic.IDictionary<string, Person> GetPersons()
  37.         {
  38.             System.Collections.Generic.Dictionary<string, Person> result = new System.Collections.Generic.Dictionary<string, Person>();
  39.             Person p1 = new Person();
  40.             Person p2 = new Person();
  41.             p1.firstName = "Si";
  42.             p1.lastName = "Li";
  43.             p1.age = 23;
  44.             result[p1.FullName] = p1;
  45.             p2.age = 25;
  46.             p2.firstName = "Wu";
  47.             p2.lastName = "Wang";
  48.             result[p2.FullName] = p2;
  49.             return result;
  50.         }
  51.     }
  52. }

aspx页面

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs" Inherits="AJAXEnabledWebApplication2.WebForm3" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" >
  4. <head runat="server">
  5.     <title>无标题页</title>
  6. </head>
  7. <body>
  8.     <form id="form1" runat="server">
  9.     <asp:ScriptManager ID="ScriptManager1" runat="server">
  10.     <Services>
  11.     <asp:ServiceReference Path="WebService2.asmx" />
  12.     </Services>
  13.     </asp:ScriptManager>
  14.     <input id="Button1" type="button" value="年龄增加一岁" onclick="AddAge()" />
  15.     <input id="Button2" type="button" value="反转数组[1,2,3,4,5,6s]" onclick="revers([1,6])" />
  16.     <input id="Button3" type="button" value="返回一个数据字典数据" onclick="getPersons()" />
  17.     <script language="javascript" type="text/javascript">
  18.     //年龄增加一岁
  19.     function AddAge(){
  20.         var person=new Object();
  21.        person.firstName="Stone";
  22.        person.lastName="Zhang";
  23.        person.age=23;
  24.        //调用webservice中的年龄增加一岁的方法 
  25.        AJAXEnabledWebApplication2.WebService2.AddAge(person,AddAgeseccessed);
  26.     }
  27.     function AddAgeseccessed(result){
  28.         //结果是24
  29.         var message=String.format("FirstName:{0}/n LastName:{1}/nFullName:{2}/nAge:{3}",
  30.         result.firstName,
  31.         result.lastName,
  32.         result.FullName,
  33.         result.age
  34.         );
  35.          alert(message);
  36.     }
  37.     //数组
  38.     function revers(array){
  39.      AJAXEnabledWebApplication2.WebService2.Reverse(array,seccessed);
  40.     }
  41.     function seccessed(result){
  42.         alert(result);
  43.     }
  44.     //数据字典
  45.     
  46.     function getPersons(){
  47.          AJAXEnabledWebApplication2.WebService2.GetPersons(getPersonsSeccssed);
  48.     }
  49.     function getPersonsSeccssed(result){
  50.     //枚举字典中的每一项
  51.     //这里得不到字典对象中的方法
  52.         for(var key in result){
  53.             alert(key+": "+result[key].age);
  54.         }
  55.     }
  56.     </script>
  57.     </form>
  58. </body>
  59. </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:

  1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Web;
  6. using System.Web.Services;
  7. using System.Web.Services.Protocols;
  8. namespace AJAXEnabledWebApplication2
  9. {
  10.     /// <summary>
  11.     /// Error 的摘要说明
  12.     /// </summary>
  13.     [WebService(Namespace = "http://tempuri.org/")]
  14.     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  15.     [ToolboxItem(false)]
  16.     [System.Web.Script.Services.ScriptService]
  17.     public class Error : System.Web.Services.WebService
  18.     {
  19.         [WebMethod]
  20.         public int GetDivsion(int a, int b)
  21.         {
  22.             return a / b;
  23.         }
  24.         [WebMethod]
  25.         public int Timeout()
  26.         {
  27.             //设置等待5秒后返回值
  28.             System.Threading.Thread.Sleep(5000);
  29.             return 0;
  30.         }
  31.     }
  32. }
asp页面代码:

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm4.aspx.cs" Inherits="AJAXEnabledWebApplication2.WebForm4" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" >
  4. <head runat="server">
  5.     <title>无标题页</title>
  6. </head>
  7. <body>
  8.     <form id="form1" runat="server">
  9.      <asp:ScriptManager ID="ScriptManager1" runat="server">
  10.     <Services>
  11.     <asp:ServiceReference Path="Error.asmx" />
  12.     </Services>
  13.     </asp:ScriptManager>
  14.     <input id="Button1" type="button" value="调用一个除零函数抛出异常" onclick="getDivsion(4,0)" />
  15.       <input id="Button2" type="button" value="调用一个除非零函数得到结果" onclick="getDivsion(4,4)" />
  16.     <input id="Button3" type="button" value="触发一个超时的错误" onclick="getTimeout()" />
  17.     <script type="text/javascript" language="javascript">
  18.     //webmethod默认属性
  19.     AJAXEnabledWebApplication2.Error.set_defaultFailedCallback(failed);
  20.     AJAXEnabledWebApplication2.Error.set_timeout(2000);
  21.     function getDivsion(a,b){
  22.         //参数后跟成功后的回调函数,和错误的回调函数 
  23.        // AJAXEnabledWebApplication2.Error.GetDivsion(a,failed);
  24.        //去掉了上面的出错的回调函数,系统会默认找set_defaultFailedCallBack()
  25.        AJAXEnabledWebApplication2.Error.GetDivsion(a,seccessed);
  26.      
  27.       
  28.     }
  29.     function getTimeout(){
  30.     //这里设置等待服务器多久还没有返回数据 就给客户端提醒超时了 服务器中设置了5秒,等俩秒后会返回超时,如果设置为6000则正常返回1
  31.       //  AJAXEnabledWebApplication2.Error.set_timeout(2000);
  32.       //  AJAXEnabledWebApplication2.Error.Timeout(seccessed,failed);
  33.       AJAXEnabledWebApplication2.Error.Timeout(seccessed);
  34.     }
  35.        //调用成功的回调函数
  36.    function seccessed(result){
  37.             alert(result);
  38.         }
  39.         //调用失败的回调函数
  40.      function failed(error){
  41.             var message=String.format("Timeout:{0}/n Message:{1}/n exceptionType:{2}/n stackTrace:{3}",
  42.             error.get_stackTrace()
  43.             );
  44.             alert(message);
  45.         }
  46.     
  47.     </script>
  48.     </form>
  49. </body>
  50. </html>

目前就了解了这些总结下~

相关文章

1.使用ajax调用varxhr;functioninvoke(){if(window.ActiveXO...
               好不容易把WebService服务器...
1新建一个工程项目用来做服务端增加一个MyService1类文件pac...
packagecom.transsion.util;importjava.io.BufferedReader;i...
再生产wsdl文件时重写描述文件1usingSystem;2usingSystem.Co...
一般情况下,使用eclipse自带的jax-ws生成webservice会自动生...