深入Atlas系列:Web Sevices Access in Atlas(8) - RTM中可叹的Web Service Proxy

  在RTM Release之前,我已经差不多将Web Service Proxy的分析写完了,可惜一个“惊天地泣鬼神”的RTM一出,这片文章的诞生晚了20多天。

使用Web Service Proxy应该是使用ASP.NET AJAX访问Web Service最常用的方法了。服务器端会根据ScriptManager中添加的Service引用而对于Web Service类进行分析,并生成相应的客户端脚本。这样开发人员就能在客户端方便而且直观地访问Web Services方法了。这是ASP.NET中很重要的功能。

从官方文档上看来,CTP和RTM似乎在脚本使用这方面没有很大的改变,只要在服务器端将一些CustomAttribute改变一下就可以了。的确没错,在使用方式上只有这点细微改变,但是事实上,从生成脚本本身来说,CTP和RTM的做法大相径庭。它们的之间的区别主要有两点:
  1. 对于生成服务器端类型的脚本(例如您可以使用new Jeffz.WebServiceProxyDemo.Employee()来构造一个对象)来说,CTP中可以自定义,RTM则不可以。
  2. 对于生成WebService方法的代理来说,CTP生成的代码很少,RTM生成的代码很多,但是符合客户端“类”的标准。也就是说,RTM版本完全将一个服务器端的类“映射”到了客户端——当然只有需要生成代理的那些方法,也不包括其实现。另外,RTM中增加了Cache功能,这是通过返回status code为304实现的。
  我在标题中的“可叹”大都是指第1点。在RTM中,客户端Serialize方法取消了对于自定义序列化的支持,这样在服务器端也少了相应自定义服务器端类型脚本的功能。原本能够使用自定义的办法,“完美”地在服务器端和客户端处理复杂对象中的“循环引用”问题,现在当然已经行不通了。从这一点上来说,真不知道算是进步了还是退步了,虽然依旧能够使用JavaScriptConveter进行扩展,但是从“美学”上来说,现在的做法只能属于“workaround”的范畴。而且,对于服务器端代码的分析也没有很大的价值了,因此在这片文中我只是对于客户端的Proxy脚本进行一些分析和比较。

至于第2点,个人认为是配合了目前的Web Serivce访问方式而改变的。它遵守了以下的规范和特点:
  1. 使用ASP.NET AJAX中定义“类”规范将服务器端Web Service类映射到了客户端中。 
  2. 提供了客户端访问Web Service方法所需要的proxy。
  3. 支持defaultUserContext、defaultSucceededCallback和defaultFailedCallback。
  对了更清晰地理解CTP和RTM之间的区别,以及RTM中构造Proxy的形式,我们来分别看一下CTP和RTM中的proxy脚本(以下Proxy代码均经过整理)。

首先,我们在CTP和RTM中定义一个相同的复杂类型:Employee。代码如下:
namespace  Jeffz.WebServicesProxyDemo
{
    
public   class  Employee
    {
        
public   string  Name;

        
public   int  Age;
    }
}

再为CTP定义一个Web Service,其中有一个GetEmployee方法。代码如下:
namespace Jeffz.WebServicesProxyDemo
{
    public
  class  EmployeeService : WebService
    {
        [WebMethod]
        
public  Employee GetEmployee( string  name,  int  age)
        {
            Employee emp 
=   new  Employee();
            emp.Name 
=  name;
            emp.Age 
=  age;

           
return  emp;
        }
    }
}

然后在CTP的页面中添加ScriptManager定义。如下:
< atlas:ScriptManager  runat ="server"  ID ="ScriptManager1" >
    
< Services >
        
< atlas:ServiceReference  InlineProxy ="true"  Path ="EmployeeService.asmx"   />
    
Services >
atlas:ScriptManager >

InlineProxy设为true,则会把这些Proxy脚本输出在页面中,而不是在页面中通过

你可能感兴趣的:(深入Atlas系列:Web Sevices Access in Atlas(8) - RTM中可叹的Web Service Proxy)