客户端访问WebService(2)

1,复杂参数类型的基本使用方式
注意: 作为参数的复杂数据类型(自定义数据类型)一定要有默认的构造函数(无参数的构造函数)
        [*] 如果参数类型手动添加了有参数的构造函数,必须手动添加一个无参数的默认构造函数
        客户端设置类型要有公开的字段和属性,使用json进行传输格式,自动进行序列化和反序列华

例子: 
自定义数据类型Color

  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 AJAXEnabledWebApplication3
  11. {
  12.     public class Color
  13.     {
  14.         //手动添加默认构造函数
  15.         public Color()
  16.         {
  17.         }
  18.         public Color(byte red, byte green, byte blue)
  19.         {
  20.             this.Red = red;
  21.             this.Blue = blue;
  22.             this.Green = green;
  23.         }
  24.         public byte Red;
  25.         public byte Green;
  26.         public byte Blue;
  27.     }
  28. }
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 AJAXEnabledWebApplication3
  9. {
  10.     /// <summary>
  11.     /// WebService1 的摘要说明
  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 WebService1 : System.Web.Services.WebService
  18.     {
  19.         [WebMethod]
  20.         [System.Web.Script.Services.GenerateScriptType(typeof(Color))]
  21.         //获取颜色的反色
  22.         public Color ReverseColor(Color color)
  23.         {
  24.             return new Color((byte)(255 -color.Red),
  25.                                     (byte)(255 - color.Blue),
  26.                                      (byte)(255 - color.Green));
  27.         }
  28.     }
  29. }
aspx代码: 

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AJAXEnabledWebApplication3._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.         <asp:ScriptManager ID="ScriptManager1" runat="server">
  10.         <Services>
  11.         <asp:ServiceReference Path="WebService1.asmx" />
  12.         </Services>
  13.         </asp:ScriptManager>
  14. <input type="button" value="ReverseColor" onclick="Reversecolor()" />
  15.     <script language="javascript" type="text/javascript">
  16.         function Reversecolor(){
  17.           
  18.            //var color=new Object();
  19.            //color.Red=50;
  20.            //color.Blue=70;
  21.            //color.Green=60;
  22.            //Json字符串代替上面的方法
  23.             var color={"Red":50,"Blue":70,"Green":60};
  24.             //把转换前的color传入回调函数
  25.             AJAXEnabledWebApplication3.WebService1.ReverseColor(color,reveseColorSucceeded,null,color);
  26.         }
  27.         //接受到转换后的结果和转换前的color
  28.         function reveseColorSucceeded(result,color){
  29.         
  30.             alert(String.format("转换后:/nRed:{0}/nBlue:{1}/nGreen:{2}/n转换前:/nRed:{3}/nBlue:{4}/nGreen:{5} ",
  31.                                          result.Red,result.Blue,result.Green,color.Red,color.Blue,color.Green));
  32.         }
  33.     </script>
  34.     </form>
  35. </body>
  36. </html>
运行后用web develop help察看
提交的json串: {"color":{"Red":50,"Green":60}}
返回的json串: {"__type":"AJAXEnabledWebApplication3.Color","Red":205,"Green":185,"Blue":195}


2,生成复杂参数类型的客户端代理

注意: 1,使用[GenerateScriptType(typeof(自定义类))]Attribute标记要生成的代理的参数类型
        2,上面的标记可以在类,接口或者方法上面定义
        3,生成的代理中将包括客户端类型的代理。且调用方法时候可以创建具体的类型
             创建具体类型的时候用 new [Namespaces].ClassName(),默认的构造函数(没有其他的构造函数,只能适用默认的无参数的构造函数)
         
例子:
还是使用上面的自定义的color类
  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 AJAXEnabledWebApplication3
  11. {
  12.     public class Color
  13.     {
  14. //默认构造函数
  15.         public Color()
  16.         {
  17.         }
  18.         public Color(byte red, byte blue)
  19.         {
  20.             this.Red = red;
  21.             this.Blue = blue;
  22.             this.Green = green;
  23.         }
  24.         public byte Red;
  25.         public byte Green;
  26.         public byte Blue;
  27.     }
  28. }
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 AJAXEnabledWebApplication3
  9. {
  10.     /// <summary>
  11.     /// WebService1 的摘要说明
  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 WebService1 : System.Web.Services.WebService
  18.     {
  19.         [WebMethod]
  20.        //下面的标记就把自己定义的类color生成了客户端代理
  21.         [System.Web.Script.Services.GenerateScriptType(typeof(Color))]
  22.         //获取颜色的反色
  23.         public Color ReverseColor(Color color)
  24.         {
  25.             return new Color((byte)(255 -color.Red),
  26.                                     (byte)(255 - color.Blue),
  27.                                      (byte)(255 - color.Green));
  28.         }
  29.     }
  30. }
aspx代码:

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AJAXEnabledWebApplication3._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.         <asp:ScriptManager ID="ScriptManager1" runat="server">
  10.         <Services>
  11.         <asp:ServiceReference Path="WebService1.asmx" />
  12.         </Services>
  13.         </asp:ScriptManager>
  14. <input type="button" value="ReverseColor" onclick="Reversecolor()" />
  15.     <script language="javascript" type="text/javascript">
  16.         function Reversecolor(){
  17.           //因为webservice中为color生成了一个客户端代理,故可以直接创建具体类型
  18.           //但代理只提供了默认的无参术的构造函数 
  19.           //不能使用 new AJAXEnabledWebApplication3.Test(50,70,60)
  20.             var color=new AJAXEnabledWebApplication3.Test();
  21.             color.Red=50;
  22.             color.Blue=70;
  23.             color.Green=60;
  24.             //把转换前的color传入回调函数
  25.             AJAXEnabledWebApplication3.WebService1.ReverseColor(color,color);
  26.         }
  27.         //接受到转换后的结果和转换前的color
  28.         function reveseColorSucceeded(result,color){
  29.         
  30.             alert(String.format("转换后:/nRed:{0}/nBlue:{1}/nGreen:{2}/n转换前:/nRed:{3}/nBlue:{4}/nGreen:{5} ",
  31.                                          result.Red,color.Green));
  32.         }
  33.     </script>
  34.     </form>
  35. </body>
  36. </html>
结果一样:
但是传输的json字符串有区别:
传给服务器的json字符串:{"color":{"__type":"AJAXEnabledWebApplication3.Color","Red":50,"Green":60}}
服务器回传的json字符串:{"__type":"AJAXEnabledWebApplication3.Color","Blue":195}

和第一个例子返回的json串一样,提交的json串有区别 下面解释

3,客户端代理的作用
   a,在对象中做了一个标记: "__type"="AJAXEnabledWebApplication3.Color"
     这样,服务器端就可以根据上面的标记选择反序列华的目标类型
   b,呈现一些多态效果

例子:
自己定义类型:
  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 AJAXEnabledWebApplication3
  11. {
  12.     public abstract class Employee
  13.     {
  14.         //员工工作年限
  15.         public int Years { getset; }
  16.         //返回类类型的名字
  17.         public string RealStatus
  18.         {
  19.             get
  20.             {
  21.                 return this.GetType().Name;
  22.             }
  23.         }
  24.         //员工工资的计算方法
  25.         public abstract int CalculateSalary();
  26.     }
  27.     //实习生 
  28.     public class Intern : Employee
  29.     {
  30.         public override int CalculateSalary()
  31.         {
  32.             return  2000;
  33.         }
  34.     }
  35.     public class Vendor : Employee
  36.     {
  37.         public override int CalculateSalary()
  38.         {
  39.             return 5000+1000*(Years-1);
  40.         }
  41.     }
  42.     public class FullTimeEmployee : Employee
  43.     {
  44.         public override int CalculateSalary()
  45.         {
  46.            return 15000+2000*(Years-1);
  47.         }
  48.     }
  49. }
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 AJAXEnabledWebApplication3
  9. {
  10.     /// <summary>
  11.     /// employeeService 的摘要说明
  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 employeeService : System.Web.Services.WebService
  18.     {
  19.         [WebMethod]
  20.        //给定义的类声明代理
  21.         [System.Web.Script.Services.GenerateScriptType(typeof(Intern))]
  22.         [System.Web.Script.Services.GenerateScriptType(typeof(Vendor))]
  23.         [System.Web.Script.Services.GenerateScriptType(typeof(FullTimeEmployee))]
  24.         public string GetSalary(Employee employee)
  25.         {
  26.             return "I am "+employee.RealStatus+",And my salary is "+employee.CalculateSalary();
  27.         }
  28.     }
  29. }
aspx页面代码:

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="AJAXEnabledWebApplication3.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.     <asp:ScriptManager ID="ScriptManager1" runat="server">
  10.     <Services>
  11.     <asp:ServiceReference Path="employeeService.asmx" />
  12.     </Services>
  13.     </asp:ScriptManager>
  14.             年限:<asp:TextBox ID="txtYear" runat="server">
  15.         </asp:TextBox><br />
  16.         类型: 
  17.         <asp:DropDownList ID="ddltype" runat="server" >
  18.         <asp:ListItem Text="Intern" Value="Intern"></asp:ListItem>
  19.         <asp:ListItem Text="Vendor" Value="Vendor"></asp:ListItem>
  20.          <asp:ListItem Text="FTE" Value="FTE"></asp:ListItem>
  21.         </asp:DropDownList><br />
  22.     <input id="Button1" type="button" value="button" onclick="GetSalary()" /><br />
  23.     Result:<asp:Label ID="lblResult" runat="server" Text=""></asp:Label>
  24.     
  25.     <script language="javascript" type="text/javascript">
  26.     function GetSalary(){
  27.         var emp=null;
  28.         var combo=$get("ddltype");
  29.         switch(combo.options[combo.selectedIndex].text){
  30.             case "Intern":
  31.                 emp=new AJAXEnabledWebApplication3.Intern();
  32.             break;
  33.             case "Vendor":
  34.                  emp=new AJAXEnabledWebApplication3.Vendor();
  35.             break;
  36.             case "FTE":
  37.                 emp=new AJAXEnabledWebApplication3.FullTimeEmployee();
  38.             break;
  39.         }
  40.          //parseInt()的作用就是把一个字符串转化成10进制的方式 可以转化成 2, 8 , 16进制
  41.         
  42.         emp.Years=parseInt($get("txtYear").value,10);
  43.         AJAXEnabledWebApplication3.employeeService.GetSalary(emp,succeeded);
  44.     }
  45.     function succeeded(result){
  46.         $get("lblResult").innerHTML=result;
  47.     }
  48.     </script>
  49.     </form>
  50. </body>
  51. </html>
aspx页面代码:

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="AJAXEnabledWebApplication3.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="TableWebService.asmx" />
  12.     </Services>
  13.     </asp:ScriptManager>
  14.     <input id="Button1" type="button" value="getTable" onclick="getTable()"/>
  15.     <div id="result"></div>
  16.     <script language="javascript" type="text/javascript">
  17.         function getTable(){
  18.           AJAXEnabledWebApplication3.TableWebService.GetTable(getSueecceded,getFailed);
  19.         }
  20.         function getSueecceded(result){
  21.             //alert(result);
  22.             var sb=new Sys.StringBuilder("<Table border='1'>");
  23.             sb.append("<tr><td>ID</td><td>Text</td></tr>");
  24.             for(var i=0;i<result.rows.length;i++){
  25.             sb.append(
  26.                   String.format("<tr><td>{0}</td><td>{1}</td></tr>",
  27.                    result.rows[i].ID,
  28.                    result.rows[i]["Text"]
  29.             ));
  30.                 $get("result").innerHTML=sb.toString();
  31.             }
  32.             sb.append("</Table>");
  33.         }
  34.         function getFailed(error){
  35.             alert(error.get_message());
  36.         }
  37.     </script>
  38.     </form>
  39. </body>
  40. </html>
需要对web.config做一些更改

  1. <system.web.extensions>
  2.     <scripting>
  3.       <webServices>
  4.       <!-- Uncomment this line to customize maxJsonLength and add a custom converter -->
  5.           <jsonSerialization maxJsonLength="500">
  6.               <converters>
  7.                   <add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, Microsoft.Web.Preview, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  8.                   <add name="DataRowConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter, PublicKeyToken=31bf3856ad364e35"/>
  9.                   <add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, PublicKeyToken=31bf3856ad364e35"/>
  10.               </converters>
  11.           </jsonSerialization>
  12.       <!-- Uncomment this line to enable the authentication service. Include requireSSL="true" if appropriate. -->
  13.       <!--
  14.         <authenticationService enabled="true" requireSSL = "true|false"/>
  15.       -->
  16.       <!-- Uncomment these lines to enable the profile service. To allow profile properties to be retrieved
  17.            and modified in ASP.NET AJAX applications, you need to add each property name to the readAccessProperties and
  18.            writeAccessProperties attributes. -->
  19.       <!--
  20.       <profileService enabled="true"
  21.                       readAccessProperties="propertyname1,propertyname2"
  22.                       writeAccessProperties="propertyname1,propertyname2" />
  23.       -->
  24.       </webServices>
  25.       <!--
  26.       <scriptResourceHandler enableCompression="true" enableCaching="true" />
  27.       -->
  28.     </scripting>
  29.   </system.web.extensions>
另:需要引入ASP.NET 2.0 AJAX Futures January CTP中的一个Microsoft.Web.Preview.dll文件,里面提供了上面配置文件中  的一些类和方法,引入dll后必须更改web.config不然会原有的代码可能会有冲突

4,使用 JavaScriptConverter

复杂类型作为返回值时可能会出现问题 --循环引用

解决方法:适用自定义数据类型封装复杂类型
               在web.config里定义一个Converter

例子:
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 AJAXEnabledWebApplication3
  9. {
  10.     /// <summary>
  11.     /// TableWebService 的摘要说明
  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 TableWebService : System.Web.Services.WebService
  18.     {
  19.         [WebMethod]
  20.         //返回一个表格
  21.         public DataTable GetTable()
  22.         {
  23.             DataTable dt = new DataTable();
  24.             dt.Columns.Add(new DataColumn("ID",typeof(int)));
  25.             dt.Columns.Add(new DataColumn("Text",typeof(string)));
  26.             Random random=new Random(DateTime.Now.Millisecond);
  27.             for (int i = 0; i < 10; i++)
  28.             {
  29.                 dt.Rows.Add(i,random.Next(0,100).ToString());
  30.             }
  31.             return dt;
  32.         }
  33.     }
  34. }
aspx代码: 

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="AJAXEnabledWebApplication3.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="TableWebService.asmx" />
  12.     </Services>
  13.     </asp:ScriptManager>
  14.     <input id="Button1" type="button" value="getTable" onclick="getTable()"/>
  15.     <div id="result"></div>
  16.     <script language="javascript" type="text/javascript">
  17.         function getTable(){
  18.           AJAXEnabledWebApplication3.TableWebService.GetTable(getSueecceded,
  19.                    result.rows[i]["Text"]
  20.             ));
  21.                 $get("result").innerHTML=sb.toString();
  22.             }
  23.             sb.append("</Table>");
  24.         }
  25.         function getFailed(error){
  26.             alert(error.get_message());
  27.         }
  28.     </script>
  29.     </form>
  30. </body>
  31. </html>
只写上面的代码会有错误,另我们需要引用ASP.NET 2.0 AJAX Futures January CTP中v1.0.61025下的一个Microsoft.Web.Preview.dll的dll  然后把v1.0.61025下的 web_CTP.config中的
  1.       <jsonSerialization maxJsonLength="500">
  2.               <converters>
  3.                   <add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, PublicKeyToken=31bf3856ad364e35"/>
  4.                   <add name="DataRowConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter, PublicKeyToken=31bf3856ad364e35"/>
  5.                   <add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, PublicKeyToken=31bf3856ad364e35"/>
  6.               </converters>
  7.           </jsonSerialization>
代码添加到web.config对应的代码中就ok

上面的步骤必须同时添加,只添加引用不改 web.config会和其他代码发生错误,原因还不知道~

5,自定义JavaScriptConverter

目的:用于处理复杂类型,处理循环引用,简化默认的复杂序列化和反序列化行为
过程:定义一个Converter继承JavaScriptConerter类
         实现SupportedTypes
         实现Serialize方法用于复杂数据
         实现Deserialize方法用于反序列化复杂数据
         在web.config中注册converter

例子回头补上~

相关文章

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会自动生...