代码改变世界

JQuery 调用WebService

2009-12-09 16:11  贺臣  阅读(4339)  评论(2编辑  收藏  举报

  以前都是Web程序调用WebService,.net把WebService封装的太简单了,所以之前都是很肤浅的用,都没有想过更深层的东西,并且只是停留在表面的添加引用和调用。

 

  1.首先建一个WebService程序

代码
/// <summary>
    
/// WebService1 的摘要说明
    
/// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(
false)]
    
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
    [System.Web.Script.Services.ScriptService]
    
public class WebService1 : System.Web.Services.WebService
    {

        [WebMethod]
        
public string HelloWorld()
        {
            CommonData.Json.ObjectSerialization ser 
= new CommonData.Json.ObjectSerialization();
            Student stu 
= new Student();
            stu.Id 
= 1;
            stu.Name 
= "hechen";
            
string json = ser.EntityToJson(stu);
            
return json;
        }
    }

 

  [System.Web.Script.Services.ScriptService] 这里得注意,默认情况下这个特性是注释起来的,如果想用Javascript来调用WebService 就要取消这个注释

  WebService 的内容不必多说,用Jquery调用WebService 返回肯定是一个xml。而xml是说明文件,而不是具体方法返回的值,所以我们做适当的处理。我们这里WebService方法返回的是JSON数据,以便在前台解析。下载是实体类序列化JSON的代码。

 

  2. 实体对象序列化JSON

  1 /**
  2  * 
  3  * 2009-5-26
  4  * 贺     臣
  5  * 
  6  * 将某个对象转化为Json数据格式
  7  * */
  8 using System;
  9 using System.Collections.Generic;
 10 using System.Linq;
 11 using System.Text;
 12 using System.IO;
 13 using System.Data;
 14 using System.ServiceModel.Web;
 15 using System.Runtime.Serialization;
 16 using System.Runtime.Serialization.Json;
 17 
 18 namespace CommonData.Json
 19 {
 20     public class ObjectSerialization
 21     {
 22         private object _entity;
 23 
 24         /// <summary>
 25         /// 被序列化得实体对象
 26         /// </summary>
 27         public object Entity
 28         {
 29             get { return _entity; }
 30             set { _entity = value; }
 31         }
 32 
 33         private string _jsonData;
 34 
 35         /// <summary>
 36         /// 被转化为json格式数据的对象
 37         /// </summary>
 38         public string JsonData
 39         {
 40             get { return _jsonData; }
 41             set { _jsonData = value; }
 42         }
 43 
 44         /// <summary>
 45         /// 无参数构造方法
 46         /// </summary>
 47         public ObjectSerialization()
 48         { 
 49         }
 50 
 51         /// <summary>
 52         /// 有参数构造方法
 53         /// </summary>
 54         /// <param name="entity">要被序列化得实体对象</param>
 55         public ObjectSerialization(object entity)
 56         {
 57             this._entity = entity;
 58         }
 59 
 60 
 61         /// <summary>
 62         /// 序列化实体对象
 63         /// </summary>
 64         /// <returns></returns>
 65         public string EntityToJson()
 66         {
 67             var serializer = new DataContractJsonSerializer(Entity.GetType());
 68             MemoryStream ms = new MemoryStream();
 69             serializer.WriteObject(ms, Entity);
 70             byte[] myByte = new byte[ms.Length];
 71             ms.Position = 0;
 72             ms.Read(myByte, 0, (int)ms.Length);
 73             string dataString = Encoding.UTF8.GetString(myByte);
 74             return dataString;
 75         }
 76 
 77 
 78         /// <summary>
 79         /// 序列化实体对象
 80         /// </summary>
 81         /// <param name="entity">要被序列化得实体对象</param>
 82         /// <returns></returns>
 83         public string EntityToJson(object entity)
 84         {
 85             this._entity = entity;
 86             return EntityToJson();
 87         }
 88 
 89         /// <summary>
 90         /// 将Json格式数据转换为对象
 91         /// </summary>
 92         /// <returns></returns>
 93         public T GetObjectJson<T>()
 94         {
 95             MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(JsonData));
 96             var serializer = new DataContractJsonSerializer(typeof(T));
 97             T t = (T)serializer.ReadObject(ms);
 98             return t;
 99         }
100 
101         /// <summary>
102         /// 将Json格式数据转换为对象
103         /// </summary>
104         /// <param name="jsonData">json数据格式</param>
105         /// <returns></returns>
106         public T GetObjectJson<T>(string jsonData)
107         {
108             this._jsonData = jsonData;
109             return GetObjectJson<T>();
110         }
111     }
112 }
113 

 

  注意序列化实体必须用可序列化特性修饰,如Serialiable,否则它不能序列化为JSON数据字符串

 

  3.前台程序Jquery调用

 1 <script src="jquery-1[1].2.3.min.js" type="text/javascript"></script>
 2 
 3     <script src="json2.js" type="text/javascript"></script>
 4     <script type="text/javascript">
 5         $(document).ready(function() {
 6         $("#btnClick").click(function() {
 7                 $.ajax({
 8                     url:"http://localhost:10168/WebService1.asmx/HelloWorld",
 9                     beforeSend: function(x) { 
10                       x.setRequestHeader("Content-Type", "application/json; charset=utf-8"); 
11                     },
12                     data:{},
13                     dataType:"json",
14                     type:"POST",
15                     error: function(x, e) { 
16                   alert(x.responseText); 
17                 }, 
18             complete: function(x) { 
19                       //alert(x.responseText); 
20                      } ,
21                     success:function(data){
22                        var msg=data.d;
23                        var json=JSON2.parse(msg);
24                        alert(json.id);
25                     }
26                 });
27                 
28             });
29         });
30     </script>

 

  这里进入了Jquery的核心文件和一个JSON2.js文件

  url:"http://localhost:10168/WebService1.asmx/HelloWorld"  这个是调用WebService方法的路径,HelloWorld 是WebService 中的方法。

  同时还要设置WebService请求后返回的参数格式(json),data是用于解释返回的值。这里值得注意的是data是一个json格式的字符串,而且对象名为d,所以我们用到了后面的var msg=data.d;

  如果我们要能够像JSON那个以  . 操作来访问键值,我们就使用到了 JSON2.js 中的方法将 json字符串转化为json对象,这样就可以以. 操作来访问对象了。

  如果我们需要调用带参数的WebService ,则我们可以再data 中指定传递的参数,参数名要和WebService中方法参数名相同。

 

  在这里应该说是没有问题,我在写这个例子的时候,并不是这么顺利,后来查了很多关于WebService的资料,原来我们要修改WebService中Web.config 的配置,否则我们不能以Url 那种格式访问WebService。

  配置如下:

  在System.web 这个节点中添加如下配置即可

  <webServices>
        <protocols>
          <add name="HttpGet"/>
          <add name="HttpPost"/>
        </protocols>
      </webServices>


作者:情缘
出处:http://www.cnblogs.com/qingyuan/
关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
联系方式: 个人QQ  821865130 ; 仓储技术QQ群 88718955,142050808 ;
吉特仓储管理系统 开源地址: https://github.com/hechenqingyuan/gitwms