最近开始着手学习ASP.NET AJAX,在园里看了很多关于这方面的文章,自己也曾买了关于ASP.NET AJAX的书籍,本文我将借鉴于老赵的WebCast深入浅出系列课程第五讲以记学习笔记的形式和大家一起学习关于ASP.NET AJAX客户端访问Web Service参数类型的序列化与反序列化内容.

     由于涉及到是示例较多,本文我将分为两部分.

本文的内容包括
   ● 复杂参数类型基本使用方式
   ● 生成复杂参数类型的客户端代理
   ● 客户端代理的作用
   ● 使用JavaScriptConverter
   ● 自定义JavaScriptConverter

一、复杂参数类型基本使用方式
   首先我们定义一个Employee类:
}

     接下来我们定义一个WebService的方法,提供给客户端调用,返回复杂类型(Employee) ;
 1}

      这其实是很简单的,我就不做过多的说明。我门先为ScriptManager指向我门上面开发的Web Service。并放置两个按扭来实现调用,最后我们将返回的结果显示在一个DIV上。
 1客户端访问Web Service--参数类型的序列化与反序列化(一)<asp:ScriptManager ID="ScriptManager1" runat="server" >
 2客户端访问Web Service--参数类型的序列化与反序列化(一)          <Services>
 3客户端访问Web Service--参数类型的序列化与反序列化(一)             <asp:ServiceReference Path="EmployeeWebService.asmx" />
 4客户端访问Web Service--参数类型的序列化与反序列化(一)          </Services>
 5客户端访问Web Service--参数类型的序列化与反序列化(一)        </asp:ScriptManager>
 6客户端访问Web Service--参数类型的序列化与反序列化(一)        
 7客户端访问Web Service--参数类型的序列化与反序列化(一)        <input id="Button1" type="button" value="无参数交互" onclick="GetEmployeeOne();" />
 8客户端访问Web Service--参数类型的序列化与反序列化(一)        <input id="Button2" type="button" value="带参数交互" onclick="GetEmployeeTwo();" />
 9客户端访问Web Service--参数类型的序列化与反序列化(一)        <br /><br />
10客户端访问Web Service--参数类型的序列化与反序列化(一)        <div id="Result" style="width:230px;height:30px;font-weight:bold;font-size:medium;background-color:#CCC;"></div>
     
     客户端的调用是怎么定义的呢?分别有发送请求的函数和回调函数:
 1客户端访问Web Service--参数类型的序列化与反序列化(一)<script type="text/javascript">
 2客户端访问Web Service--参数类型的序列化与反序列化(一)        function GetEmployeeOne()
 3        }
      如上面所介绍,演示了一个关于复杂参数的基本使用,运行结果如下所示:
        客户端访问Web Service--参数类型的序列化与反序列化(一)

二、生成复杂参数类型的客户端代理
      这一步其实是很简单的.代码我们就重用上面的代码就可以了.新建立一个页面,把上面示例的页面代码Copy过来作适当的修改就OK了.我门先看看客户端的代码定义:
1客户端访问Web Service--参数类型的序列化与反序列化(一)<asp:ScriptManager ID="ScriptManager1" runat="server">
2客户端访问Web Service--参数类型的序列化与反序列化(一)         <Services>
3客户端访问Web Service--参数类型的序列化与反序列化(一)            <asp:ServiceReference Path="EmployeeWebService.asmx"  InlineScript="true" />
4客户端访问Web Service--参数类型的序列化与反序列化(一)         </Services>
5客户端访问Web Service--参数类型的序列化与反序列化(一)        </asp:ScriptManager>
6客户端访问Web Service--参数类型的序列化与反序列化(一)         
7客户端访问Web Service--参数类型的序列化与反序列化(一)        <input id="Button2" type="button" value="使用客户端代理" onclick="GetEmployee();" />
8客户端访问Web Service--参数类型的序列化与反序列化(一)        <br /><br />
9客户端访问Web Service--参数类型的序列化与反序列化(一)        <div id="Result" style="width:230px;height:30px;font-weight:bold;font-size:medium;background-color:#CCC;"></div>
  
     同上一个例子一样,我们将ScriptManager指向EmployeeWebService.asmx这个Web服务,下面是JS定义,服务器端的发方法为了在客户端调用方法,在客户端会生成方法的代理,那怎么使用客户端方法的代理呢?下面我们来看看通过客户端代理的使用,代码如下定义:
>

      我们很清楚的看到上面示例中我们使用的是一个Employee对象,而非上个示例中的JSON字符串了,其实使用客户端代理和JSON字符串是完全等价的. 下面是两者的定义:

1客户端访问Web Service--参数类型的序列化与反序列化(一)//使用JSON进行传输
2

       那Employee这个客户端代理是怎么生成的呢?这并非是我们在服务端定义的Employee类,不过与它还是有很大的关系,那这个客户端代理是怎么生成的以及通过什么样的方法可以查看到这个代理的生成呢?前面我们在为ScriptManager引入Web服务的时候后面加入了这样一个属性:InlineScript="true",通过设置它我们就能够在客户端显示生成的客户端代理.那怎么查看呢?运行你所开发的页面,右键查看源文件,里面有下面的定义(不同的代理会有所不同,下面是本例中生成的代理):

 1}

     通过上面的客户端代理我们可以查看到,在客户端为我们注册了一个gtc("Employee"),生成这样的代理之后,我们就可以在客户端通过代理的方法来使用Employee类了.这或许可以说是一种映射吧(个人意见).要让服务器在运行的时候生成客户端的代理其实很简单,上面说这么多归根到底就一个代码实现,我们只需要在服务端方法上加入[GenerateScriptType(typeof(Employee))]这样一句话就可以了,完整定义如下:

1客户端访问Web Service--参数类型的序列化与反序列化(一)[WebMethod]
2客户端访问Web Service--参数类型的序列化与反序列化(一)[GenerateScriptType(typeof(Employee))]  //在客户端生成一个复杂的代理
3客户端访问Web Service--参数类型的序列化与反序列化(一)public Employee GetEmployeeTwo(Employee employee)
4   

三、客户端代理的作用
     事实上我们在使用客户端代理的时候,有很多对象对我们开发都是很有用的,其实在使用客户端代理的实质就是为对象在客户端生成了一个"__type"标记,如我们上面使用Employee类,在客户端生成的"__type"标记为:

客户端访问Web Service--参数类型的序列化与反序列化(一)__type="Employee";

     下面我们来看看一个实例,由于上面我们定义了Employee,这里我们就定义一个User做为实例的对象.

 1客户端访问Web Service--参数类型的序列化与反序列化(一)public abstract class User
 2}

      我们上面定义了User类,并抽象了一个方法getSalary(),在服务器端这里是可以实现多态的,接下来我们为该对象(User)对象开发一个Web Service;

 1客户端访问Web Service--参数类型的序列化与反序列化(一)[WebService(Namespace = "http://tempuri.org/")]
 2客户端访问Web Service--参数类型的序列化与反序列化(一)[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
 3客户端访问Web Service--参数类型的序列化与反序列化(一)[ScriptService]
 4}

      在客户端我们通过传递不同的字类对象在WebService里通过多态的方式去调用具体的实现类.我们现在来看看在客户端怎么通过__type标记来实现这种"多态"的调用.

 1客户端访问Web Service--参数类型的序列化与反序列化(一)<script type="text/javascript">
 2客户端访问Web Service--参数类型的序列化与反序列化(一)    function getSalary()
 3>

      我们在客户端通过指定不同的对象(也就是为__type标记指定不同的客户端类型),服务器端根据标记选择反序列化的目标类型来实现"多态"效果的调用;

 1客户端访问Web Service--参数类型的序列化与反序列化(一)<asp:ScriptManager ID="ScriptManager1" runat="server">
 2客户端访问Web Service--参数类型的序列化与反序列化(一)    <Services>
 3客户端访问Web Service--参数类型的序列化与反序列化(一)       <asp:ServiceReference Path="UserWebService.asmx" />
 4客户端访问Web Service--参数类型的序列化与反序列化(一)    </Services>
 5客户端访问Web Service--参数类型的序列化与反序列化(一)    </asp:ScriptManager>
 6客户端访问Web Service--参数类型的序列化与反序列化(一)    <select id="UserType">
 7客户端访问Web Service--参数类型的序列化与反序列化(一)        <option value="FullTime">全职</option>
 8客户端访问Web Service--参数类型的序列化与反序列化(一)        <option value="PartTime">兼职</option>
 9客户端访问Web Service--参数类型的序列化与反序列化(一)    </select>
10客户端访问Web Service--参数类型的序列化与反序列化(一)    &nbsp;
11客户端访问Web Service--参数类型的序列化与反序列化(一)    <input id="btnSalary" type="button" value="计算工资" onclick="getSalary();" /><br />
12客户端访问Web Service--参数类型的序列化与反序列化(一)    <div id="Result" style="width:230px;height:30px;font-weight:bold;background-color:#CCC;"></div>

   通过下拉选择控件中选择不同的类型(FullTime,PartTime),动态的指定__type标记的值.将调用结果呈现在DIV里显示出来,运行结果如下所示;
   客户端访问Web Service--参数类型的序列化与反序列化(一)

   关于客户端访问Web Service--参数类型的序列化与反序列化的前部分就先介绍到这里,后续部分我将尽快记录下来,我很喜欢以写文章的这种方式来做笔记,喜欢大家多多支持与指点.文章里的不妥之处还望前辈们多多指正,谢谢.

  文章里使用的示例代码我将在后半部分完成后提供给大家参考.

-----------------------------------------------------



      

  

相关文章:

  • 2021-10-28
猜你喜欢
  • 2021-07-25
  • 2022-12-23
  • 2022-02-09
  • 2022-12-23
  • 2021-07-26
  • 2021-05-21
  • 2021-12-25
相关资源
相似解决方案