自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

jQuery調用WCF服務傳遞JSON對象

開發(fā) 開發(fā)工具
本文詳細介紹了如何使用WCF去創(chuàng)建一個服務端口,從而能夠被ASP.Net頁面通過jQuery的AJAX方法訪問。這個例子就是為了說明,在沒有一個好的客戶端代理的情況下,我們是如何調用Web服務的。

下面這個示例使用了WCF去創(chuàng)建一個服務端口從而能夠被ASP.Net頁面通過jQuery的AJAX方法訪問,我們將在客戶端使用Ajax技術來 與WCF服務進行通信。這里我們僅使用jQuery去連接Web Service,而不去使用ASP.Net AJAX庫,至于為什么不使用AJAX庫中,那是因為我們在項目中已經(jīng)使用了jQuery,而它已經(jīng)能處理全部的AJAX請求和所有功能,并且,如果我們 一旦使用ASP.NET AJAX庫,我們也必須多包含一個超過80Kb的數(shù)據(jù)量(調試模式下會更大),但這也不是說ASP.NET AJAX庫不實用,事實上,如果使用了相同的類庫,我們能夠少寫很多的額外代碼,但這個例子就是為了說明,在沒有一個好的客戶端代理的情況下,我們是如何調用Web服務的。

WCF 服務:

我們先創(chuàng)建一個WebSite,然后添加一個AJAX-enabled WCF Service,從而創(chuàng)建WCF服務。(請確保你使用了正確的.Net Framework 版本,我用的是3.5)
創(chuàng)建WCF服務

在我們添加完service后,它會自動進入該service的后置代碼文件,Go ahead and browse around the file for a second.

首先我們要做的是找到"AspNetCompatibilityRequirements"并將其值置為 "Allowed":

[AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed )] 
 

這個屬性的設置可將我們的服務跑在ASP.NET compatibility模式,如果我們未將該值設為"Allowed",那么就無法通過ASP.Net去訪問到該服務,這個屬性是當你添加 "AJAX-enabled WCF Service" 時自動生成的。更多祥細請參看MSDN。

現(xiàn)在再來看自動生成的后置代碼文件,我們能發(fā)現(xiàn)已經(jīng)存在了一個被標注了"OperationContract"特性的"DoWork()" 的方法,這個方法是自動生成的,我們將使用這個方法來完成下面的示例。我們再來為該方法添加一個"WebGet"的特性,并設"RequestFormat" 的值為 "Json." 我們再來為該方法加上另外的一個特性RequestFormat,WebGet 和Get動詞一樣,作用于一個UriTemplate(本文不對此作進一步討論),RequestFormat 特性可以讓我們接收JSON格式的請求。

我們的 "DoWork()" 方法如下:

  1. [OperationContract]   
  2. [WebGet( RequestFormat=WebMessageFormat.Json )]   
  3. public void DoWork()   
  4. {   
  5.     // Add your operation implementation here   
  6.     return;   

對象的模型:

我們希望通過"DoWork()" 來傳遞一個叫“Person”的對象,那先來創(chuàng)建一個Person對象寫入到當前類的頭部,其包含字段和屬性(Name, Age 和 the types of Shoes they own),這個類同時也作為所傳遞JSON的結構。

  1. [Serializable]   
  2. [DataContract( Namespace = "http://www.dennydotnet.com/", Name = "Person" )]   
  3. public class Person   
  4. {   
  5.     private string _name = string.Empty;   
  6.     private int _age = 0;   
  7.  
  8.     [DataMember( IsRequired = true, Name = "Name" )]   
  9.     public string Name   
  10.     {   
  11.         get { return _name; }   
  12.         set { _name = value; }   
  13.     }   
  14.  
  15.     [DataMember( IsRequired = true, Name = "Age" )]   
  16.     public int Age   
  17.     {   
  18.         get { return _age; }   
  19.         set { _age = value; }   
  20.     }   
  21.  
  22.     [DataMember( IsRequired = true, Name = "Shoes" )]   
  23.     public List<String> Shoes;   
  24. }   
  25.  
  26.    

我們已經(jīng)為 "Person”類的名稱和命名空間標注上了契約,我們仍需要為屬性授于數(shù)據(jù)成員特性,為每個屬性 設置"IsRequired"并具體指定其名稱。你只需要具體指定名字,如果它和屬性名不一樣。舉例來說吧,如果你有一個屬性叫作“Level”,但你在 數(shù)據(jù)成員特性中賦值為“Rank”,現(xiàn)在我們要回去修改我們的“DoWork()”方法,去接收Person對象作為參數(shù)。具體參下面代碼塊。

  1. [OperationContract]   
  2. [WebGet( RequestFormat=WebMessageFormat.Json )]   
  3. public void DoWork(Person p)   
  4. {   
  5.     // Add your operation implementation here   
  6.     return;   
  7. }  
  8.   

對Web.Config文件進行配置:
我們僅需對web.config文件做出很小的修改就能對服務進行訪問了。首先加入一個 serviceBehavior 用來允許Http Get請求,再添加一些調試選項幫助。代碼如下:

Below </endpointBehaviors>

  1. <serviceBehaviors>   
  2.     <behavior name="ServiceAspNetAjaxBehavior">   
  3.         <serviceMetadata httpGetEnabled="true" httpGetUrl="" />   
  4.         <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" />   
  5.     </behavior>   
  6. </serviceBehaviors> 
  7.   

在<services>這里</services>之間,你的代碼如下:

  1. <service name="Service" behaviorConfiguration="ServiceAspNetAjaxBehavior">   
  2.     <endpoint address="" behaviorConfiguration="ServiceAspNetAjaxBehavior"   
  3. binding="webHttpBinding" contract="Service" />   
  4.     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />   
  5. </service>   
  6.   

注意:

  1. <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" />  

允許例外可能會導致內部應用相關信息,包括個人信息的泄露。設置為true僅用于調試目的!

你的Web.config文件修改后如下圖所示:

Webconfig文件

回到前端頁面:

現(xiàn)在我們的服務已經(jīng)被創(chuàng)建和配置了,再來關注前端頁面部分吧(確保頁面已引用jQuery.js文件),首先來創(chuàng)建一個簡單的Json對象用于向service傳遞,我們在Person類結構的基礎上創(chuàng)建該JSON對象。

  1. var mydata = { "Name":"Denny""Age":23, "Shoes":["Nike","Osiris","Etnies"] };  

如果你對JSON還不是很熟悉,我們可以把它看作一個對象,這個小工具幫助你來查看 (JsonViewer):

JsonViewer

我們需要使用WCF和jQuery進行Ajax通信,下面的代碼創(chuàng)建了一個AJAX呼叫,在頭部設置了GET方式,和內容類型為 application/json,將url的路徑置為WCF 服務的 svc 文件,并在其后加上/和所要執(zhí)行方法的名稱,在這里我們要調用的是DoWork()方法,data是用來傳遞參數(shù),為了讓jQuery不去自動處理我們的 數(shù)據(jù),將processData設為false,我們還加入了對success和error的處理,以更多的了解AJAX執(zhí)行完之后的處理過程。

  1. function sendAJAX(data) {   
  2.     $.ajax({   
  3.         type: "GET",   
  4.         contentType: "application/json",   
  5.         url: "Service.svc/DoWork",   
  6.         data: data,   
  7.         processData: false,   
  8.         success: function(msg){   
  9.                 alert( "Data Saved!" );   
  10.         },   
  11.         error:function(XMLHttpRequest, textStatus, errorThrown){   
  12.                 alert( "Error Occured!" );   
  13.         }   
  14.     });   
  15. }  
  16.   

然而很不幸運,這里有一個小的問題,我們必須發(fā)送真正的JSON字符串,作為參數(shù)傳遞。但還沒有簡單的方法讓JSON對象轉換為字符串,如果你試了data.toString(),得到的會是一個 "[object Object]"值。這不是我們想要的。

所以在這里我們要修改方法使得它能將JSON轉換成字符串。

  1. function json2string(strObject) {   
  2. var c, i, l, s = '', v, p;   
  3.  
  4. switch (typeof strObject) {   
  5. case 'object':   
  6. if (strObject) {   
  7. if (strObject.length && typeof strObject.length == 'number') {   
  8. for (i = 0; i < strObject.length; ++i) {   
  9.      v = json2string(strObject[i]);   
  10. if (s) {   
  11.       s += ',';   
  12.      }   
  13.      s += v;   
  14.     }   
  15. return '[' + s + ']';   
  16.    } else if (typeof strObject.toString != 'undefined') {   
  17. for (i in strObject) {   
  18.      v = strObject[i];   
  19. if (typeof v != 'undefined' && typeof v != 'function') {   
  20.       v = json2string(v);   
  21. if (s) {   
  22.        s += ',';   
  23.       }   
  24.       s += json2string(i) + ':' + v;   
  25.      }   
  26.     }   
  27. return '{' + s + '}';   
  28.    }   
  29.   }   
  30. return 'null';   
  31. case 'number':   
  32. return isFinite(strObject) ? String(strObject) : 'null';   
  33. case 'string':   
  34.   l = strObject.length;   
  35.   s = '"';   
  36. for (i = 0; i < l; i += 1) {   
  37.    c = strObject.charAt(i);   
  38. if (c >= ' ') {   
  39. if (c == '\\' || c == '"') {   
  40.      s += '\\';   
  41.     }   
  42.     s += c;   
  43.    } else {   
  44. switch (c) {   
  45. case '\b':   
  46.       s += '\\b';   
  47. break;   
  48. case '\f':   
  49.       s += '\\f';   
  50. break;   
  51. case '\n':   
  52.       s += '\\n';   
  53. break;   
  54. case '\r':   
  55.       s += '\\r';   
  56. break;   
  57. case '\t':   
  58.       s += '\\t';   
  59. break;   
  60. default:   
  61.       c = c.charCodeAt();   
  62.       s += '\\u00' + Math.floor(c / 16).toString(16) +   
  63.        (c % 16).toString(16);   
  64.     }   
  65.    }   
  66.   }   
  67. return s + '"';   
  68. case 'boolean':   
  69. return String(strObject);   
  70. default:   
  71. return 'null';   
  72. }   
  73. }   
  74.    

現(xiàn)在我們有一個方法可以將JSON對象轉成我們所需要的字符串,現(xiàn)在我們回過頭去修改我們之前定義的 "mydata" 變量,我們應當按下面去應用所寫的json2string方法。

  1. var mydata = { "Name":"Denny""Age":23, "Shoes":["Nike","Osiris","Etnies"] };   
  2. var jsonStr = "p=" + json2string(mydata);  

注意在下面我準備了"p=" 字符在我們的JSON字符串中,“p”對應于"DoWork()" 方法中的參數(shù),當我們將參數(shù)改名為"Dude" ( 例如DoWork(Person Dude) )時,我們也必須將此處替換為"Dude="

現(xiàn)在我們準備好了查詢字符串,我們參看到我們如何調用服務:

  1. http://www.dennydotnet.com/Service.svc/DoWork/?p={ "Name":"Denny", "Age":23, "Shoes":["Nike","Osiris","Etnies"] } 

你將接收到一個已經(jīng)為URL編碼處理過的值,如下:

  1. http://www.dennydotnet.com/Service.svc/DoWork/?p=%7b+%22Name%22%3a%22Denny%22%2c+%22Age%22%3a23%2c+%22Shoes%22%3a%5b%22Nike%22%2c%22Osiris%22%2c%22Etnies%22%5d+%7d%3b 

緊接著我們去調用"SendAjax()" javascript 方法,現(xiàn)在能夠調試我們的服務并驗證數(shù)據(jù)是否被傳遞到服務。如下圖

驗證數(shù)據(jù)

現(xiàn)在你僅需要在DoWork()方法里實現(xiàn)自己的邏輯。注意無論你如何怎么去做 在WCF的服務端,它已經(jīng)為你做好了。

【編輯推薦】

  1. 使用ASP.NET AJAX調用WCF服務項模板
  2. 詳解自定義托管宿主WCF解決方案開發(fā)配置過程
  3. 詳解WCF可擴展框架中的行為擴展
  4. WCF中通過Dispose有效實現(xiàn)重用
  5. WCF開發(fā)基礎
責任編輯:yangsai 來源: 網(wǎng)絡
相關推薦

2011-05-16 09:30:30

jQueryWCF

2009-07-27 17:54:39

WCF服務ASP.NET

2011-04-01 10:40:53

WCFiPhone調用

2009-07-23 10:51:20

jQuery調用Web返回JSON數(shù)據(jù)

2011-01-19 12:52:49

WCF.NETC#

2009-12-07 14:35:42

WCF異步調用

2011-07-08 20:54:12

iPhone WCF

2010-02-26 17:51:16

Silverlight

2009-11-06 09:48:40

WCF服務

2010-02-26 15:24:27

WCF釋放服務對象

2010-07-06 10:07:10

jQueryJSON

2010-03-02 13:54:43

WCF控制服務對象釋放

2009-11-05 17:00:34

WCF有序傳遞

2009-12-21 15:12:40

WCF操作Stream

2010-01-05 13:47:43

Jquery Json

2009-12-21 10:19:05

Silverlight

2010-02-25 14:53:44

WCF調用服務異常

2009-04-07 16:21:35

ASP.NETAJAXWCF

2010-03-01 14:01:50

WCF服務異步調用

2009-12-22 15:14:33

WCF調用
點贊
收藏

51CTO技術棧公眾號