http://developer.51cto.com/art/200906/128643.htm
下面這個樣本使用了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)
在我們添加完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()" 方法如下:
[OperationContract] [WebGet( RequestFormat=WebMessageFormat.Json )] public void DoWork() { // Add your operation implementation here return; }
對象的模型:
我們希望通過"DoWork()" 來傳遞一個叫“Person”的對象,那先來建立一個Person對象寫入到當前類的頭部,其包含欄位和屬性(Name, Age 和 the types of Shoes they own),這個類同時也作為所傳遞JSON的結構。
[Serializable] [DataContract( Namespace = "http://www.dennydotnet.com/", Name = "Person" )] public class Person { private string _name = string.Empty; private int _age = 0; [DataMember( IsRequired = true, Name = "Name" )] public string Name { get { return _name; } set { _name = value; } } [DataMember( IsRequired = true, Name = "Age" )] public int Age { get { return _age; } set { _age = value; } } [DataMember( IsRequired = true, Name = "Shoes" )] public List<String> Shoes; }
我們已經為 "Person”類的名稱和命名空間標註上了契約,我們仍需要為屬性授於資料成員特性,為每個屬性 設定"IsRequired"並具體指定其名稱。你只需要具體指定名字,如果它和屬性名稱不一樣。舉例來說吧,如果你有一個屬性叫作“Level”,但你在 資料成員特性中賦值為“Rank”,現在我們要回去修改我們的“DoWork()”方法,去接收Person對象作為參數。具體參下面代碼塊。
[OperationContract] [WebGet( RequestFormat=WebMessageFormat.Json )] public void DoWork(Person p) { // Add your operation implementation here return; }
對Web.Config檔案進行配置:
我們僅需對web.config檔案做出很小的修改就能對服務進行訪問了。首先加入一個 serviceBehavior 用來允許Http Get請求,再添加一些調試選項協助。代碼如下:
Below </endpointBehaviors>
<serviceBehaviors> <behavior name="ServiceAspNetAjaxBehavior"
> <serviceMetadata httpGetEnabled="true" httpGetUrl=""
/> <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"
/>