成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

jQuery調用WCF服務傳遞JSON對象

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

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

WCF 服務:

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

現在再來看自動生成的后置代碼文件,我們能發現已經存在了一個被標注了"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”的對象,那先來創建一個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.    

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

  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文件

回到前端頁面:

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

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

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

JsonViewer

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

  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.   

然而很不幸運,這里有一個小的問題,我們必須發送真正的JSON字符串,作為參數傳遞。但還沒有簡單的方法讓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.    

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

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

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

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

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

你將接收到一個已經為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 方法,現在能夠調試我們的服務并驗證數據是否被傳遞到服務。如下圖

驗證數據

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

【編輯推薦】

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

2011-05-16 09:30:30

jQueryWCF

2011-04-01 10:40:53

WCFiPhone調用

2009-07-27 17:54:39

WCF服務ASP.NET

2009-12-07 14:35:42

WCF異步調用

2011-07-08 20:54:12

iPhone WCF

2011-01-19 12:52:49

WCF.NETC#

2010-02-26 17:51:16

Silverlight

2009-11-06 09:48:40

WCF服務

2010-02-26 15:24:27

WCF釋放服務對象

2009-07-23 10:51:20

jQuery調用Web返回JSON數據

2010-03-02 13:54:43

WCF控制服務對象釋放

2010-07-06 10:07:10

jQueryJSON

2009-12-21 15:12:40

WCF操作Stream

2009-11-05 17:00:34

WCF有序傳遞

2009-12-21 10:19:05

Silverlight

2009-04-07 16:21:35

ASP.NETAJAXWCF

2010-02-25 14:53:44

WCF調用服務異常

2010-03-01 14:01:50

WCF服務異步調用

2009-12-22 15:14:33

WCF調用

2009-11-06 13:33:56

WCF Dispatc
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区视频 | 久久av网 | 久久久久久久一级 | 美女毛片免费看 | 99国产在线 | 亚洲国产成人精品女人久久久野战 | 日韩av在线一区二区三区 | 国产精品国产精品国产专区不卡 | 久久久久香蕉视频 | 国产精品久久精品 | 国产一区二区在线播放 | 91精品一区 | 欧美不卡 | 日日操操操 | 天天天天天天天干 | 久久久久www | 亚洲综合成人网 | www.色53色.com | 农村真人裸体丰满少妇毛片 | 日本一区二区三区视频在线 | 在线免费视频一区 | 久久久精品一区 | 呦呦在线视频 | 超碰免费观看 | 91精品国产91久久久久久最新 | 欧美黄色网 | 中文字幕亚洲欧美 | 日韩欧美黄色 | 国产精品亚洲欧美日韩一区在线 | 国产精品久久久久久久久久久免费看 | 欧美视频| 暖暖日本在线视频 | 国产在线一区二区三区 | 国产高清在线观看 | 狠狠爱综合网 | 国产精品不卡 | 成人3d动漫一区二区三区91 | 亚洲伊人a | 久久久亚洲一区 | 久久精品国产99国产 | 亚洲精品视频一区二区三区 |