在這個實戰中我們將使用DataContract,ServiceContract來構建WCF服務,並使用VS2008內置的“WCFSVCHost”運行我們創建的WCF服務,並使用“WCF測試客戶端”來測試我們創建的服務。
在此WCF服務中我們將建立一個關於Book的服務,並實現對Book的添加、刪除和檢索操作。
第一步:創建“WCF服務庫”
“文件(F)”->“新建項目(P)...”打開新建項目對話框。在左側的“項目類型”中選擇“WCF”,然後再在右側的“模板”中選擇“WCF服務庫”。
在下面的“名稱”文本框中,填寫我們要創建的WCF服務庫的項目名稱“Services”。
《圖1》
點擊確定,會創建出我們的WCF服務庫項目,在解決方案中會自動爲我們生成兩個類文件“IService.cs”和“Service.cs”。
《圖2》
這兩個類文件是兩個WCF示例文件,對我們開發沒有什麼用處,現在我們刪掉這兩個文件。
第二步:創建Book實體類
在“解決方案窗口”中,我們右擊Services項目名,選擇“添加”,再單擊“類”
《圖3》
在彈出的“添加新項”窗口中,選擇“類”,並在“名稱”文本框中寫入項名稱“Book.cs”。
第三步:爲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項目名,選擇“添加”,再單擊“類”
《圖3》
在彈出的“添加新項”窗口中,選擇“類”,並在“名稱”文本框中寫入項名稱“IBookService.cs”。
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項目名,選擇“添加”,再單擊“類”
《圖3》
在彈出的“添加新項”窗口中,選擇“類”,並在“名稱”文本框中寫入項名稱“BookService.cs”。
《圖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配置”。
《圖8》
在此界面中暴露兩個對外的終結點(外部可以訪問到的類或接口),其中下面一個是元數據終結點,用來向外提供服務信息的終結點。而另一個(即上面的終結點),是向外公佈我們編寫的[ServiceContract]的類,但我們可以看到它的Contract還是我們在第一步中刪掉的Services.IService1這個終結點。不僅如此,在右側的服務中還依舊是我們在第一步中刪除的Services.Service1服務。這說明雖然在第一步中我們刪除了那兩個自動生成的類文件,但配置文件中仍沒有刪除這兩個類文件的配置信息。
下面我們把它們改變一下。
單擊左側的“服務”-“Services.Service1”在右側的Name,彈出“服務類型瀏覽器”對話框,在此類型中我們找到此WCF服務項目編譯出來的Services.dll文件,雙擊它就可以出現此服務中的對外公佈的服務,點擊選中它單擊確定。
《圖9》
這樣我們就可以把對外公司的服務改變爲我們剛編寫的服務了。
然後,我們展開左側“服務”->“Services.BookService”->“終結點”,單擊第一個“空名稱”,從右邊的“終結點屬性”中的Contract中我們可以看到,這裏的Contract仍然用的是Services.IService1。
《圖10》
那我們按照上面的做法,找到此WCF服務項目編譯出來的Services.dll,雙擊它找到裏面對應的ServiceContract點擊確定就可以了。
《圖11》
點擊菜單“文件”-“保存”就可以把我們對App.Config的修改保存回配置文件了。
OK,現在我們對WCF的配置算是完成了
第七步:運行WCF進行測試。
在VS2008中爲我們提供了測試WCF的工具,按F5啓動WCF會出現兩個東西
一個是在右下角的托盤圖標中會出現WCFSVCHost(WCF服務主機),它爲我們在開發時候提供了一個運行WCF的服務器,用來爲測試客戶端提供WCF服務。
圖《13》
“測試客戶端”從WcfSVCHost中取得WCF服務的元數據,解析爲右側的“服務結構樹”,從這裏面我們可以看到此WCF服務爲我們提供了一個服務契約“IBookService”,此服務契約中對外提供了三個可調用的方法。
雙擊AddBooks()方法,我們可以從右面輸入相關的數據然後點擊“調用”,就可以把數據送給WCF服務器,去調用對應的方法了。