gfreesky博客


    留下自己的脚印是一件很惬意的事:)
    博客园--美好愿望 美好生活......
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ASP.NET AJAX初学体验之客户端访问WebService(2)

Posted on 2008-10-28 20:13  gfreesky  阅读(298)  评论(0编辑  收藏  举报

今天要说的是客户端访问WebService--序列化与反序列化

我还是第一次在ASP.NET AJAX里听到序列化

==========================Demo1=====================

Demo1演示的是在客户端用JSON字符

先添加引用

<asp:ScriptManager ID="ScriptManager1" runat="server">
            
<Services>
                
<asp:ServiceReference Path="ColorService.asmx" InlineScript="true" />
            
</Services>
        
</asp:ScriptManager>

看看Javascript如何调用WebService,这里的数据类型为Complex
 <script language="javascript" type="text/javascript">
            function ReverseColor()
            {
                
//JSON序列化字符
                var color = {"Red" : 50"Green" : 100"Blue" : 200};
                ColorService.Reverse(color, onSucceeded);
            }
            
            function onSucceeded(result)
            {
                alert(String.format(
                    
"Red: {0}\nGreen: {1}\nBlue: {2}",
                    result.Red,
                    result.Green,
                    result.Blue));
            }            
        
</script>

var color = {"Red" : 50, "Green" : 100, "Blue" : 200},这行就是以JSON字符赋予color类型,这种写法似乎
有点不习惯啊!不过没关系,下一个Demo是我们熟悉的写法,onSucceeded是成功的回调函数。

我们看看ColorService是如何定义的:

[ScriptService]
public class ColorService  : System.Web.Services.WebService
{
    [WebMethod]
    [GenerateScriptType(
typeof(Color))] //验证2_ComplexTypeProxy.aspx
    public Color Reverse(Color color)
    {
        
return new Color(
            (
byte)(255 - color.Red),
            (
byte)(255 - color.Green),
            (
byte)(255 - color.Blue));
    }
    
}


原来是Reverse方法接收一个Color类型的参数并返回一个Color类型,的确很简单
最后我们看下Color类是如何定义的:


public class Color
    {
        
public Color() { }

        
public Color(byte red, byte green, byte blue)
        {
            
this.Red = red;
            
this.Green = green;
            
this.Blue = blue;
        }

        
public byte Red;

        
public byte Green;

        
public byte Blue;
    }


再简单不过,应该不用介绍。我们还是直接进入Demo2吧。

==========================Demo2=====================

Demo2介绍的是如何在客户端生成复杂类型的代理,看下页面Javascript的代码

<script language="javascript" type="text/javascript">
            function ReverseColor()
            {
               
                
//在Service方法前要标记,[GenerateScriptType(typeof(Color))] 
                var color = new ComplexType.Color(); 
                color.Red 
= 50;
                color.Green 
= 100;
                color.Blue 
= 200;
                ColorService.Reverse(color, onSucceeded);
            }
            
            function onSucceeded(result)
            {
                alert(String.format(
                    
"Red: {0}\nGreen: {1}\nBlue: {2}",
                    result.Red,
                    result.Green,
                    result.Blue));
            }
        
</script>

 

 啊哈,var color = new ComplexType.Color();
    color.Red = 50;
    color.Green = 100;
    color.Blue = 200;

这种写法是我们所熟悉的,不过你真的这么写的话,还需要在Service端进行如下标注
[GenerateScriptType(typeof(Color))] ,可以把它标到类的前面,也可以标到方法名的前面(推荐)
就像下面的代码一样:

[ScriptService]
public class ColorService  : System.Web.Services.WebService
{
    [WebMethod]
    [GenerateScriptType(
typeof(Color))] //验证2_ComplexTypeProxy.aspx
    public Color Reverse(Color color)
    {
        
return new Color(
            (
byte)(255 - color.Red),
            (
byte)(255 - color.Green),
            (
byte)(255 - color.Blue));
    }
    
}


=============================Demo3========================

好我们对Demo2进行一下小小的改变

<script language="javascript" type="text/javascript">
            function ReverseColor()
            {
               
                
//在Service方法前要标记,[GenerateScriptType(typeof(Color))] 
                var color = new Object(); 
                color.__type=ComplexType.Color;
                color.Red 
= 50;
                color.Green 
= 100;
                color.Blue 
= 200;
                ColorService.Reverse(color, onSucceeded);
            }
            
            function onSucceeded(result)
            {
                alert(String.format(
                    
"Red: {0}\nGreen: {1}\nBlue: {2}",
                    result.Red,
                    result.Green,
                    result.Blue));
            }
        
</script>

 

其他都不变,能达到同样的效果。

Demo4介绍的是在客户端如何调用返回类型为Table的Service;Demo5介绍的是在客户端如何

调用有循环调用的Service,这2个Demo比较复杂,这里暂时就不介绍了,您可以参考相关资料

或Email给我,我会给你解答。(Email:gfreesky@gmail.com)