wcf 基礎教程 第一講 wcf基礎知識


最近工作有點忙,感覺有點累啊,很久沒有更新博客了,看到自己的博客訪問量日漸下降,我於心不忍,決定還是重新開博來吸引大家的關注。這次要說的不是別的,正是大名鼎鼎的wcf。或者在中間我會穿插MVC的說明,畢竟上一個系列MVC也沒有寫完就過年了,這次希望能堅持到底。呵呵

既然是基礎,那我們就來了解一下wcf的前生今世。然后再用一個小實例說明一下就可以結束了。

SOA(面向服務的架構) 大家都很明白,wcf就是.Net平台下為了這個目的為出生的一個精品,作為微軟技術的大一統,可以說值得我們深入的學習。

WCF(Windows Communication Foundation)是作為.Net framework 3.0發布的,所以只有2008及其以上的版本才可以創建wcf應用程序,如果你還是使用2005 那么就升級一下吧。

WCF是對現有分布式通信技術的整合,其中包括Com/DCom、.Net Remoting、Web服務及其WSE(web服務的升級版本)、MSMQ。

COM就不用多說了,我也不懂,是采用了面向組件的設計方式,我們可以通過接口來進行調用。說到面向組件的設計方式,還有幾種 面向服務的設計(CO)、面向對象的設計(OO).

.Net Remoting 遠程調用,可以實現分布式開發,但是不能跨平台或者說是只能是在.Net和.Net之間進行調用。不能實現真正意義上的面向服務。

Web 服務 WSE 可以說是真正意義上的面向服務的設計,可以實現跨平台的調用,但是web服務只能通過http的方式傳輸,並且安全性、可靠性得不到有效的控制,所以不能完成企業級應用的要求。

MSMQ 是基於Windows的消息隊列,它的優點也很多,例如可以支持離線傳輸、斷點傳輸等。但是只能在同一台服務器或者說是同一台電腦上傳輸,根本就談不上分布式。

WCF是現有分布式技術的大一統,整合了這些技術的優點,可以實現可靠性高、安全性高、跨平台、跨語言的調用,並且wcf的學習曲線相對較高,但是要自己親自動手實現一個簡單的wcf服務應用程序也是很簡單的。

今天不說wcf 契約、服務 、綁定等內容,留着以后說,要不以后就不能開博了。先來一個msdn上通用的實例來說明創建一個wcf應用程序是多么的easy。

1.創建一個空白的解決方法。

2.創建wcf的項目。我們按照在項目中會實際用到的項目結構來組織。

我來解釋一下這些項目的結構。

  1. ConsoleHosting 是一個控制台應用程序,用來承載Wcf服務。你會說什么叫承載?說白了就是可以訪問到wcf服務,因為創建了一個wcf應用程序,就相當於一台機器人,但是不給他電池,他就沒辦法走路,承載就相當於給他動力,他就可以運行。wcf的承載方式可以分為自承載(Self Hosting) 和IIS承載(在IIS中 通過像訪問web網站一樣訪問)。
  2. Contracts 項目是一個類庫項目,他是用來存放wcf的契約,就是一些接口
  3. Services也是一個類庫項目,他是用來存放實現了契約的服務,就是一些實現了接口的類
  4. WebClient 是一個web項目,采用的是MVC 4.用來作為調用wcf服務的客戶端存在。
  5. WebHosting 是一個web項目,采用的是MVC4,用來作為承載wcf服務。可能你會說有兩個承載wcf的項目,多余,是的,我在這里的目的就是為了說明,wcf可以有多種承載方式。

首先在Contracts 項目中添加一個接口,然后添加兩個計算數值的方法。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.ServiceModel;
 6 namespace Chinaer.WcfDemo.Contracts
 7 {
 8     [ServiceContract(Name = "ICal", Namespace = "http://www.chinaer.com")]
 9     public interface ICal
10     {
11         [OperationContract]
12         int Add(int x, int y);
13 
14         int Sub(int x, int y);
15     }
16 }

注意:在方法中Add上面有OperationContract 操作契約,但是在Sub方法上沒有添加這個Attribute。

 

在服務類中實現這個契約,在Services中添加一個類,實現這個接口。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using Chinaer.WcfDemo.Contracts;
 6 namespace Chinaer.WcfDemo.Services
 7 {
 8     public class CalService : ICal
 9     {
10         public int Add(int x, int y)
11         {
12             return x + y;
13         }
14 
15         public int Sub(int x, int y)
16         {
17             return x - y;
18         }
19     }
20 }

實現了服務類,下面就需要承載wcf服務,這個wcf相對比較簡單,沒有使用配置文件,通過編程方式來承載。當然我們一般在實際項目中不推薦這么做。

首先通過Console 控制台承載,其實控制台承載和Web承載的編程代碼是一樣的,只是項目類型不同而已。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.ServiceModel;
 6 using Chinaer.WcfDemo.Contracts;
 7 using System.ServiceModel.Description;
 8 namespace Chinaer.WcfDemo.ConsoleHosting
 9 {
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             using (ServiceHost host = new ServiceHost(typeof(CalService), new Uri("http://127.0.0.1:8888")))
15             {
16                 //ServiceEndPoint 終結點 包含Address地址 Binding綁定 Contracts契約 簡稱ABC
17                 host.AddServiceEndpoint(typeof(ICal), new WSHttpBinding(), "calService");
18                 //添加服務終結點
19                 if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
20                 {
21                     //判斷是否在配置文件中定義了元數據終結點
22                     ServiceMetadataBehavior metaData = new ServiceMetadataBehavior();
23                     metaData.HttpGetEnabled = true;
24                     metaData.HttpGetUrl = new Uri("http://127.0.0.1:8888/CalService/MetaData");
25                     host.Description.Behaviors.Add(metaData);//添加元數據終結點
26                 }
27                 host.Opened += delegate {
28 
29                     Console.WriteLine("wcf服務已經啟動 按任意鍵終止");
30                 };
31                 if (host.State != CommunicationState.Opened)
32                 {
33                     host.Open();
34                 }
35                 Console.Read();
36 
37             }
38 
39         }
40     }
41 }

添加了宿主以后就可以通過瀏覽器查看服務元數據。要查看元數據,首先要啟動控制台程序。

在瀏覽器中輸入服務元數據地址 就可以訪問到元數據,如果代碼正確可以看到如下結果。

 

出現了上面的元數據結果,就表示wcf是可以正常調用的。wcf服務是通過元數據的方式對外發布的,ServiceMedataBehavior是元數據發布的Behavior。

既然服務已經發布成功,那么我們就在客戶端調用看是否可以得到結果。

 

可以看到調用wcf服務成功。我把在MVC中的一些簡單處理介紹一下。

首先我在HomeController中添加了一個Add方法用來調用Wcf服務

1      public int Add(string first, string second)
2         {
3             CalService.CalClient client = new CalService.CalClient();
4             return client.Add(Convert.ToInt32(first), Convert.ToInt32(second));
5         }

首先就是創建了一個Wcf服務的客戶端代理,以后細說,在前台通過jquery進行傳值。

 1 $(function () {
 2         $("#btnAdd").click(function () {
 3             var first = $("#txtFirst").val();
 4             var second = $("#txtSecond").val();
 5             $.ajax({
 6                 url: '@Url.Action("Add", "Home")',
 7                 cache: false,
 8                 async: true,
 9                 data: "first=" + first + "&second=" + second,
10                 success: function (xhr, ts) {
11                     alert(xhr);
12 
13                 },
14                 error: function (XMLHttpRequest, textStatus, errorThrown) {
15                     alert(textStatus);
16                 }
17 
18 
19             });
20 
21 
22         });
23 
24 
25     });

這樣,我們的一個簡單的訪問wcf的程序就完成了。wcf的范圍很廣,以后我們一起來交流。

 源碼下載,項目文件大小超出了博客園的限制,所以我上傳到了百度網盤,我分享鏈接,http://pan.baidu.com/share/link?shareid=458336&uk=1610729480


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM