標籤:des style blog http color 使用
WCF(Windows Communication Foundation)是作為.Net framework 3.0發布的,所以只有2008及其以上的版本才可以建立wcf應用程式
WCF是對現有分布式通訊技術的整合,其中包括Com/DCom、.Net Remoting、Web服務及其WSE(web服務的升級版本)、MSMQ。
現在決定 學習WCF ,所以在部落格園裡參考 http://www.cnblogs.com/jiagoushi/archive/2013/03/15/2962351.html 親手練習了一番
1.建立wcf的項目。我們按照在項目中會實際用到的項目結構來組織。
我來解釋一下這些項目的結構。
- ConsoleHosting 是一個控制台應用程式,用來承載Wcf服務。你會說什麼叫承載?說白了就是可以訪問到wcf服務,因為建立了一個wcf應用程式,就相當於一台機器人,但是不給他電池,他就沒辦法走路,承載就相當於給他動力,他就可以運行。wcf的承載方式可以分為自承載(Self Hosting) 和IIS承載(在IIS中 通過像訪問web網站一樣訪問)。
- Contracts 項目是一個類庫項目,他是用來存放wcf的契約,就是一些介面
- Services也是一個類庫項目,他是用來存放實現了契約的服務,就是一些實現了介面的類
- WebClient 是一個web項目,採用的是MVC 4.用來作為調用wcf服務的用戶端存在。
- WebHosting 是一個web項目,採用的是MVC4,用來作為承載wcf服務。可能你會說有兩個承載wcf的項目,多餘,是的,我在這裡的目的就是為了說明,wcf可以有多種承載方式。
首先在Contracts 項目中添加一個介面,然後添加兩個計算數值的方法。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;namespace Contracts{ /* 契約類 */ // 定義WCF服務合約 [ServiceContract(Name="ICal",Namespace ="http://www.Chinaer.com")] public interface ICal { [OperationContract] int add (int x, int y); int Sub (int x, int y); }}
注意:在方法中Add上面有OperationContract 操作契約,但是在Sub方法上沒有添加這個Attribute。
在服務類中實現這個契約,在Services中添加一個類,實現這個介面。
using Contracts;using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Services{ /* 服務類 */ public class CalServices:ICal { public int add (int x, int y) { int num = x + y; return num; } public int Sub (int x, int y) { return x - y; } }}
實現了服務類,下面就需要承載wcf服務,這個wcf相對比較簡單,沒有使用設定檔,通過編程方式來承載。當然我們一般在實際項目中不推薦這麼做。
首先通過Console 控制台承載,其實控制台承載和Web承載的編程代碼是一樣的,只是項目類型不同而已。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using System.ServiceModel.Description;using Contracts;using Services;namespace ConsoleHosting{ class Program { static void Main (string[] args) { using( ServiceHost host = new ServiceHost(typeof(CalServices), new Uri("http://127.0.0.1:8081")) ) { // ServiceEndPoint 總結點 包含 Address 地址 Bingding 綁定 Contract 契約 簡稱ABC host.AddServiceEndpoint(typeof(ICal), new WSHttpBinding(), "calService"); // 添加服務總結點 if( host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null ) { // 判斷是否在設定檔中定義了元素總結點 ServiceMetadataBehavior metadata = new ServiceMetadataBehavior(); metadata.HttpGetEnabled = true; metadata.HttpGetUrl = new Uri("http://127.0.0.1:8081/CalService/MetaData"); // 添加中繼資料總結點 host.Description.Behaviors.Add(metadata); } host.Opened += delegate { Console.WriteLine("WCF已經啟動,請按任意鍵結束!!"); }; if( host.State != CommunicationState.Opened ) { host.Open(); } Console.Read(); } } }}
添加了宿主以後就可以通過瀏覽器查看服務中繼資料。要查看中繼資料,首先要啟動控制台程式。
在瀏覽器中輸入服務中繼資料地址 就可以訪問到中繼資料,如果代碼正確可以看到如下結果。
出現了上面的中繼資料結果,就表示wcf是可以正常調用的。wcf服務是通過中繼資料的方式對外發布的,ServiceMedataBehavior是中繼資料發佈的Behavior。
既然服務已經發布成功,那麼我們就在用戶端調用看是否可以得到結果。
可以看到調用wcf服務成功。我把在MVC中的一些簡單處理介紹一下。
首先我在HomeController中添加了一個Add方法(這裡會根據請求的方式來調用對應的方法)用來調用Wcf服務
[HttpPost] public ActionResult Add (string first,string second) { CalServices client = new CalServices(); int number = client.add(Convert.ToInt32(first),Convert.ToInt32(second)); return Json(number,JsonRequestBehavior.AllowGet); } [HttpGet] public int Add () { return 0; }
介面的布局和 使用Ajax的使用
效果如下(樣式就沒有貼出來了)
首頁面
這樣,我們的一個簡單的訪問wcf的程式就完成了。wcf的範圍很廣,以後我們一起來交流。如果要下載源碼 :http://pan.baidu.com/share/link?shareid=458336&uk=1610729480