WCF足跡1:概述

一、什麼是WCF
Windows Conmmunication Foundation是.NET Framework3.0的重要組成部份,現已經集成到Vista 和 WindowsServer2008中
它是Microsoft爲構建面向服務的應用SOA提供的分佈式通信編程框架,使用該框架,員可以構建跨平臺、安全、可靠和支持事務處理的企業級互聯應用解決方案。它整合了.Net平臺下所有的和分佈式系統有關的技術,是微軟分佈式應用程序開發的集大成者。掌握了WCF,就相當於掌握了叩開SOA大門的鑰匙。
從通信範圍來看:它可以跨進程、跨機器、跨子網、企業網乃至於 Internet
從宿主程序來看:可以是控制檯程序,IIS,Windows Forms,Windows Service等爲宿主程序。
從支持的協議來看:它支持TCP,HTTP,命名管道,MSMQ等。
從安全模式來看:它支持SAML, Kerberos,X509,用戶/密碼,自定義等多種標準與模式。

二、WCF有三項突出的特性:
1.與多種現有微軟分佈式技術的統一性(集成性)
統一ASMX,.NET Remoting,TCP,命名管道,MSMQ等開發模型。爲各種應用提供了單一的編程模型。
2.提供對不同平臺互操作性的支持(跨平臺)
通過標準的SOAP消息WCF可以與其他應用程序進行交互,很好地支持了跨平臺跨操作系統的的目標。
3.以及顯式的面向服務特性

三、WCF服務框架模型
WCF服務由三個重要部份組成:服務類,宿主程序和終結點。
服務類(Service):就是一個類,包含一系列的方法,通過這些方法向外界提供服務。類的本身還包括服務契約、操作契約和數據契約。
宿主(Host):一種應用程序域和進程,服務將在該環境中運行。
終結點(EndPoint):服務對外暴露出來的調用方式。


《圖2》

例如:有一個醫生想在一個小鎮上爲大家提供醫療服務,因此他在小鎮上註冊了一家診所,鎮上的人們可以來這裏看病,或者打電話進行諮詢。
在這個例子中,心理醫生就是我們的“服務類”,它包含了提供心理諮詢的行爲;而診所就是“宿主”,心理醫生通過診所向外提供服務;這位醫生向鎮上的人們提供兩種服務方式,一種是在診所爲人們看病;另一種是通過電話爲人們服務,這兩種服務方式就是“終結點”,鎮上的人們可以通過這兩個終結點來獲取服務。

服務類:
   //服務類的契約
    [ServiceContract]
    public interface IBookService
    {
        [OperationContract]
        void AddBooks(Book book);
        [OperationContract]
        List<Book> GetAllBooks();
        [OperationContract]
        void RemoveBook(string id);
    }
    //實現服務契約的類
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
    public class BookService : IBookService
    {
        List<Book> _Books = new List<Book>();
        public void AddBooks(Book book)
        {
            book.BookNO = Guid.NewGuid().ToString();
            _Books.Add(book);
        }

        public List<Book> GetAllBooks()
        {
            return _Books;
        }

        public void RemoveBook(string id)
        {
            Book book = _Books.Find(p => p.BookNO == id);
            _Books.Remove(book);
        }
    }
宿主:
public static void Main(string[] args)
{
      ServiceHost host = new ServiceHost(typeof(BookService));
      host.Open();
      Console.WriteLine("Service is up and running.......");
      Console.ReadLine();
      host.Close();
}

終結點:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="NewBehavior">
                    <serviceMetadata httpGetEnabled="true" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="NewBehavior" name="Services.BookService">
                <clear />
                <endpoint address="basic" binding="basicHttpBinding" contract="Services.IBookService"
                    listenUriMode="Explicit">
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"
                    listenUriMode="Explicit">
                </endpoint>
                <endpoint address="ws" binding="ws2007HttpBinding" contract="Services.IBookService"
                    listenUriMode="Explicit">
                </endpoint>
                <endpoint address="net.tcp://localhost:8888/BookService" binding="netTcpBinding"
                    contract="Services.IBookService" listenUriMode="Explicit">
                </endpoint>
                <endpoint address="net.pipe://localhost/BookService" binding="netNamedPipeBinding"
                    bindingConfiguration="" contract="Services.IBookService" />
                <host>
                    <baseAddresses>
                        <add baseAddress="
http://localhost:8080/BookService" />
                    </baseAddresses>
                </host>
            </service>
        </services>
    </system.serviceModel>
</configuration>
   
在WCF服務的三個部份中,終結點又是最複雜的,終結點由三部份組成:
Address:服務的調用地址。
如果要通過“終結點”獲得服務,就必須要有“終結點”的訪問地址。如:要從醫生處獲取服務,就必須要有醫生診所的地址和醫生的電話號碼,
Binding:爲“終結點”指定通信的信道(http,TCP等)。如:醫生用“診所看病”和“打電話”這兩種信道來提供服務。
Contract:指明我們可以通過終結點獲得什麼樣的服務。如:去診所我們可以獲得看病服務,而打電話只能獲得諮詢服務。
上面這三部份就是我們常說的終結點的“A-B-C
<endpoint address="basic" binding="basicHttpBinding" contract="Services.IBookService"></endpoint>


《圖3》

四、WCF服務與客戶端通信的模型:


《圖4》
服務器端:
首先、需要定義和實現WCF服務端契約
然後、在宿主程序中創建ServiceHost實例,向外提供“終結點”
最後、打開通訊信道,等待訪問
客戶端:
首先、根據服務器端提供的契約生成客戶端的代理類。
然後、根據服務器端暴露的終結點信息在客戶端生終結點的複本。
最後、通過代理類和終結點複本調用遠程服務器端的功能。

在我們配置服務器端的終結點的時候我們需要添加一個“元數據終結點”,元數據終結點也有我們上面所述的A-B-C三個屬性,只不是這裏的C(契約)不再是我們定義的服務契約,而是IMetadataExchange類型的契約。在配置WCF服務的時候必須要爲我們的服務配置這個“元數據終結點”,那這個元數據終結點到底要做的是做什麼的,爲什麼是必需的呢?首先我們需要了解什麼是“元數據”,所謂的“元數據”就是描述數據的數據,即描述當前服務有哪些服務契約、方法契約和數據契約以及終結點的信息。而“元數據終結點”就是向外界暴露元數據的終結點。當客戶端添加WCF服務引用的時候,會首先通過元數據取得服務器端的契約信息、終結點信息,然後根據這些信息在客戶端創建了代理類,我們在客戶端調用WCF服務的過程實際上就是通過代理類調用WCF服務的過程。
還回到上面醫生的例子中。醫生在小鎮上註冊了一家診所後,需要把他的診所介紹給大家,所以醫生就在報紙上爲診所刊登了廣告,廣告內容中介紹了診所能爲大家提供什麼樣的服務,診所的地址,乘車路線,聯繫電話等,大家就可以通過廣告來了解診所的信息並很容易找到診所取得服務。這份廣告的內容實際上就是診所的“元數據終結點”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章