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
/** * * 2009-5-26 * 賀 臣 * * 將某個對象轉化為Json數據格式 * */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.ServiceModel.Web; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; namespace CommonData.Json { public class ObjectSerialization { private object _entity; /// <summary> /// 被序列化得實體對象 /// </summary> public object Entity { get { return _entity; } set { _entity = value; } } private string _jsonData; /// <summary> /// 被轉化為json格式數據的對象 /// </summary> public string JsonData { get { return _jsonData; } set { _jsonData = value; } } /// <summary> /// 無參數構造方法 /// </summary> public ObjectSerialization() { } /// <summary> /// 有參數構造方法 /// </summary> /// <param name="entity">要被序列化得實體對象</param> public ObjectSerialization(object entity) { this._entity = entity; } /// <summary> /// 序列化實體對象 /// </summary> /// <returns></returns> public string EntityToJson() { var serializer = new DataContractJsonSerializer(Entity.GetType()); MemoryStream ms = new MemoryStream(); serializer.WriteObject(ms, Entity); byte[] myByte = new byte[ms.Length]; ms.Position = 0; ms.Read(myByte, 0, (int)ms.Length); string dataString = Encoding.UTF8.GetString(myByte); return dataString; } /// <summary> /// 序列化實體對象 /// </summary> /// <param name="entity">要被序列化得實體對象</param> /// <returns></returns> public string EntityToJson(object entity) { this._entity = entity; return EntityToJson(); } /// <summary> /// 將Json格式數據轉換為對象 /// </summary> /// <returns></returns> public T GetObjectJson<T>() { MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(JsonData)); var serializer = new DataContractJsonSerializer(typeof(T)); T t = (T)serializer.ReadObject(ms); return t; } /// <summary> /// 將Json格式數據轉換為對象 /// </summary> /// <param name="jsonData">json數據格式</param> /// <returns></returns> public T GetObjectJson<T>(string jsonData) { this._jsonData = jsonData; return GetObjectJson<T>(); } } }
注意序列化實體必須用可序列化特性修飾,如Serialiable,否則它不能序列化為JSON數據字符串
3.前台程序Jquery調用
<script src="jquery-1[1].2.3.min.js" type="text/javascript"></script> <script src="json2.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function() { $("#btnClick").click(function() { $.ajax({ url:"http://localhost:10168/WebService1.asmx/HelloWorld", beforeSend: function(x) { x.setRequestHeader("Content-Type", "application/json; charset=utf-8"); }, data:{}, dataType:"json", type:"POST", error: function(x, e) { alert(x.responseText); }, complete: function(x) { //alert(x.responseText); } , success:function(data){ var msg=data.d; var json=JSON2.parse(msg); alert(json.id); } }); }); }); </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>
以上就是本文的全部內容,希望能給大家一個參考,也希望大家多多支持。