WCF開發實戰系列一:創建第一個WCF服務

在這個實戰中我們將使用DataContract,ServiceContract來構建WCF服務,並使用VS2008內置的“WCFSVCHost”運行我們創建的WCF服務,並使用“WCF測試客戶端”來測試我們創建的服務。
在此WCF服務中我們將建立一個關於Book的服務,並實現對Book的添加、刪除和檢索操作。

第一步:創建“WCF服務庫”
“文件(F)”->“新建項目(P)...”打開新建項目對話框。在左側的“項目類型”中選擇“WCF”,然後再在右側的“模板”中選擇“WCF服務庫”。
在下面的“名稱”文本框中,填寫我們要創建的WCF服務庫的項目名稱“Services”。

clip_image002
《圖1》
點擊確定,會創建出我們的WCF服務庫項目,在解決方案中會自動爲我們生成兩個類文件“IService.cs”和“Service.cs”。
clip_image004

《圖2》
這兩個類文件是兩個WCF示例文件,對我們開發沒有什麼用處,現在我們刪掉這兩個文件。

第二步:創建Book實體類
在“解決方案窗口”中,我們右擊Services項目名,選擇“添加”,再單擊“類”

clip_image006
《圖3》
在彈出的“添加新項”窗口中,選擇“類”,並在“名稱”文本框中寫入項名稱“Book.cs”。

clip_image008
《圖4》

第三步:爲Book實體類編寫代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
 
namespace Services
{
[DataContract]
    public class Book
    {
        [DataMember]
        public string BookNO;
        [DataMember]
        public string BookName;
        [DataMember]
        public decimal BookPrice;
    }
}
 

爲了保證此類在WCF調用中能夠被序列化,我們在Book類上面加入[DataContract]標籤,在每個需要序列化的成員變量上加入[DataMember]標籤。這兩個標籤在使用的進候需要導入using System.Runtime.Serialization命名空間。
到此爲至,我們創建完了需要在服務中傳輸的複雜的數據類型Book。

第四步:創建服務接口
創建服務接口,聲明對外發布的類和方法。
在“解決方案窗口”中,我們右擊Services項目名,選擇“添加”,再單擊“類”

clip_image009
《圖3》
在彈出的“添加新項”窗口中,選擇“類”,並在“名稱”文本框中寫入項名稱“IBookService.cs”。

clip_image010
《圖5》
在此類文件中我們編寫服務接口,代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
 
namespace Services
{
    [ServiceContract]
    public interface IBookService
    {
        [OperationContract]
        void AddBooks(Book book);
 
        [OperationContract]
        List<Book> GetAllBooks();
 
        [OperationContract]
        void RemoveBook(string id);
    }
}
 

在IBookService接口上面,我們定義了[ServiceContract]標籤,此標籤代表此接口及實現此接口的類都是對外發布的Service類,在每個需要對外發布的方法上都加上[OperationContract]標籤,以使外部可以訪問到此方法。
[ServiceContract]和[OperationContract]這兩個標籤需要導入using System.ServiceModel命名空間。

第五步:創建實現服務接口的類
實現我們上面聲明的服務接口,實現對Book的添加、刪除和檢索的具體功能。
在“解決方案窗口”中,我們右擊Services項目名,選擇“添加”,再單擊“類”

clip_image005
《圖3》
在彈出的“添加新項”窗口中,選擇“類”,並在“名稱”文本框中寫入項名稱“BookService.cs”。

clip_image011
《圖6》
在此類文件中編寫代碼實現IBookService.cs服務接口。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
 
namespace Services
{
    [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);
        }
    }
}
 

此類是對IBookService接口的具體實現,在此類的上面我們聲明瞭[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]標籤,此標籤代表這個類採用SingleTone(單類模式)來生成對象。
使用[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]接口需要導入using System.ServiceModel;命名空間。

第六步:配置WCF服務
到目前爲至,我們建立好了WCF服務,那我們如何讓WCFSVCHost(WCF服務主機)理解我們編寫的服務類,並能夠運行我們編寫的服務呢。這需要我們在App.Config裏面註冊一下我們的WCF服務。
代碼如下:

<system.serviceModel>
    <services>
      <service behaviorConfiguration="Services.Service1Behavior" name="Services.BookService">
        <endpoint address="" binding="wsHttpBinding" contract="Services.IBookService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8731/Design_Time_Addresses/Services/Service1/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Services.Service1Behavior">
          <!-- 爲避免泄漏元數據信息,
          請在部署前將以下值設置爲 false 並刪除上面的元數據終結點 -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- 要接收故障異常詳細信息以進行調試, 
          請將下值設置爲 true。在部署前 
            設置爲 false 以避免泄漏異常信息-->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
</system.serviceModel>
 

這麼多東西誰能記得下?!!!
沒關係,VS2008爲我們提供了可視化的操作界面。
在Services項目中右擊“App.Config”配置文件,在彈出的右鍵菜單中選擇“編輯WCF配置”。

clip_image012
《圖7》
彈出界面如下:

clip_image013
《圖8》
在此界面中暴露兩個對外的終結點(外部可以訪問到的類或接口),其中下面一個是元數據終結點,用來向外提供服務信息的終結點。而另一個(即上面的終結點),是向外公佈我們編寫的[ServiceContract]的類,但我們可以看到它的Contract還是我們在第一步中刪掉的Services.IService1這個終結點。不僅如此,在右側的服務中還依舊是我們在第一步中刪除的Services.Service1服務。這說明雖然在第一步中我們刪除了那兩個自動生成的類文件,但配置文件中仍沒有刪除這兩個類文件的配置信息。
下面我們把它們改變一下。
單擊左側的“服務”-“Services.Service1”在右側的Name,彈出“服務類型瀏覽器”對話框,在此類型中我們找到此WCF服務項目編譯出來的Services.dll文件,雙擊它就可以出現此服務中的對外公佈的服務,點擊選中它單擊確定。

clip_image014
《圖9》
這樣我們就可以把對外公司的服務改變爲我們剛編寫的服務了。
然後,我們展開左側“服務”->“Services.BookService”->“終結點”,單擊第一個“空名稱”,從右邊的“終結點屬性”中的Contract中我們可以看到,這裏的Contract仍然用的是Services.IService1。

clip_image015
《圖10》
那我們按照上面的做法,找到此WCF服務項目編譯出來的Services.dll,雙擊它找到裏面對應的ServiceContract點擊確定就可以了。

clip_image016
《圖11》
點擊菜單“文件”-“保存”就可以把我們對App.Config的修改保存回配置文件了。

OK,現在我們對WCF的配置算是完成了

第七步:運行WCF進行測試。
在VS2008中爲我們提供了測試WCF的工具,按F5啓動WCF會出現兩個東西
一個是在右下角的托盤圖標中會出現WCFSVCHost(WCF服務主機),它爲我們在開發時候提供了一個運行WCF的服務器,用來爲測試客戶端提供WCF服務。

clip_image017
圖《12》
另一個是“WCF測試客戶端”

clip_image018
圖《13》
    “測試客戶端”從WcfSVCHost中取得WCF服務的元數據,解析爲右側的“服務結構樹”,從這裏面我們可以看到此WCF服務爲我們提供了一個服務契約“IBookService”,此服務契約中對外提供了三個可調用的方法。
雙擊AddBooks()方法,我們可以從右面輸入相關的數據然後點擊“調用”,就可以把數據送給WCF服務器,去調用對應的方法了。

clip_image019
圖《14》
雙擊GetAllBooks方法,我們可以查看添加的書的信息

clip_image020
圖《15》
雙擊RemoveBoo()方法就可以把書刪除

clip_image021
圖《16》

clip_image022
圖《17》

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