上一次提到,我們的WCF程序宿主是發布到IIS上面的。雖然這樣做未嘗不可,不過不便於我們進行“開始”或“停止”WCF服務的操作。所以再次嘗試了編寫以窗體應用程序作為WCF服務宿主的方式,並取得了成功。而下文則記錄整個程序的建立過程。
一、創建WCF服務
首先創建一個WCF服務項目,項目名稱為WCFService,解決方案為WCFDemo。
新建的WCF服務項目已經包含了一個GetData()函數,我們這個例子中直接使用這個函數。
二、創建WCF宿主
同樣地,我們為這個解決方案增加一個WCF服務宿主項目。項目名稱為WCFServerHost,程序類型為Windows窗體應用程序。
在程序的窗口上放置一個按鈕,並將按鈕的標題改為“開啟服務”,修改后的窗口如下:
然后為程序添加System.ServiceModel和WcfService兩個引用
最后,雙擊程序按鈕添加如下代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
private
ServiceHost Host =
null
;
private
void
button1_Click(
object
sender, EventArgs e)
{
if
(Host ==
null
)
{
Host =
new
ServiceHost(
typeof
(WCFService.Service1));
//綁定
System.ServiceModel.Channels.Binding httpBinding =
new
BasicHttpBinding();
//終結點
Host.AddServiceEndpoint(
typeof
(WCFService.IService1), httpBinding,
"http://localhost:8002/"
);
if
(Host.Description.Behaviors.Find<System.ServiceModel.Description.ServiceMetadataBehavior>() ==
null
)
{
//行為
ServiceMetadataBehavior behavior =
new
ServiceMetadataBehavior();
behavior.HttpGetEnabled =
true
;
//元數據地址
behavior.HttpGetUrl =
new
Uri(
"http://localhost:8002/Service1"
);
Host.Description.Behaviors.Add(behavior);
//啟動
Host.Open();
}
}
}
|
然后,在關閉窗口事件中添加如下代碼:
1
2
3
4
5
6
7
|
private
void
Form1_FormClosed(
object
sender, FormClosedEventArgs e)
{
if
(Host !=
null
)
{
Host.Close();
}
}
|
好了,現在運行應用程序,開啟服務后,在IE瀏覽器中輸入http://localhost:8002/Service1,檢查是否正常顯示元數據。
三、編寫客戶端程序
在解決方案中再添加一個新的Windows窗體應用程序,程序名稱為WCFClient。
然后,在關閉窗口事件中添加如下代碼:在程序項目上按右鍵,選擇“添加服務引用……”。在添加服務引用對話框的地址欄位中,輸入:http://localhost:8002/Service1,發現服務后,將服務命名空間改為ServiceReferenceDemo,然后點擊“確定”按鈕。
添加完服務后,我們在程序窗口上放置一個按鈕,並將按鈕標題命名為“執行”。雙擊“執行”按鈕,並編寫如下代碼:
1
2
3
4
5
6
7
8
9
|
private
void
button1_Click(
object
sender, EventArgs e)
{
using
(ServiceReferenceDemo.Service1Client sc =
new
ServiceReferenceDemo.Service1Client())
{
sc.Open();
MessageBox.Show(sc.GetData(10));
sc.Close();
}
}
|
四、測試執行
首先確保Host程序已經運行、然后執行客戶端程序,並點擊“執行”按鈕,檢查是否有一個正確的返回值。