漫畫式學習WCF-04:開放多個端點

  • 3870
  • 0
  • 2013-08-03

漫畫式學習WCF-04:開放多個端點

繼上一章之後,相信大家對於設定WCF的組態不陌生了,當然,上一篇只是一個簡單的導引並非是WCF組態設定的全部,而本篇是承接著上一篇而來,目標在於帶大家快速設定多個端點。

 

如果有試著實作上一篇的朋友們,請再次拿出上次實作後的成果,如果沒有,就麻煩您先參閱上一篇吧!

我們先打開WCF組態編輯工具,可以看到如下圖:

 

image

 

 

上圖中紅色方框所框選的部份就是我們本篇所要操作的項目,而我們打算要一次開放三個端點,並且都採用完全不同的Binding:TCP、WSHttp、BasicHttp。並且客戶端採用ASP.Net,叫用不同端點。經過上一篇之後,服務:MyFirstWCF.Service1已經擁有一個採用BasicHttpBinding的端點,而現在我們只需要再加上兩個端點即可。請在”端點”上按右鍵,如下圖所示:

image

 

新增一個服務端點(EndPoint)。

 

image

 

接下來這個部份要好好思考一下了,因為我們已經決定好要開放三個端點出來,因此,我們需要想一下該怎麼命名這三個端點好讓使用者方便識別。這裡的端點命名關乎之後客戶端動態叫用,所以不得不慎,為了方便記憶,我打算依Binding來做為本篇三個端點的命名,其對應如下:

 

  1. 採用BasicHttpBinding的端點,命名為:Basic
  2. 採用TcpBinding的端點,命名為:TCP
  3. 採用WSHttpBinding的端點,命名為:WS

 

決定好命名規則之後,我們除了給予這個新的端點名字之外,也需要修改一下之前已經存在的端點。

image

每個端點都是ABC,所以不能免俗的,我們得手動設定這個新端點的ABC。有別於上一篇的設定方式,這裡的端點設定沒有精靈,全得自己來,但是也沒那麼困難就是了,因為已經有了上一篇的概念。我們先輸入Address,記得要採用相對位址歐。[因為事後要將WCF程式寄宿在IIS上]

 

image

 

 

再來是給予這個端點一個Binding,可以在Binding欄位空白處點一下,它會自動以DropDownList的方式提供下拉選單,請選擇:WSHttpBinding

 

image

 

最後就是ABC中的C了,也是最後一項,設定完之後就完工了。緊接著在Contract欄位點一下,會發現原本空白的欄位突然出現了一個內容為"..."的按鈕,如下圖:

image

其實這個按鈕的功能就是”瀏覽”,主要是用來查找Contract所在位置,和我們上一篇中WCF服務設定精靈中的其中一個步驟有異曲同工之處;它也是先找到*.dll所在的實體位置,接著再對該*.dll連點兩下即可看見Contract。如下圖所示:

image

image

image

 

按下開啟之後,就會載回原視窗欄位。

image

 

再加一個端點(EndPoint),不過為了節省篇幅,所以請各位依上述步驟舉一反三。

其結果如下圖

image

 

如此一來,這個服務就擁有了三個端點(EndPoint)。不過可別忘了要”儲存”歐!因為這個編輯工具並沒有和Web.config檔做同步。

 

image

 

 

接下來我們回到我們的VS2010,並且讓Web.config檔重新載入。

 

image

 

WCF服務設定完成之後,再來就是需要一個ASP.Net的Client來使用這個服務,請依下列步驟加入一個新的ASP.Net專案到本方案中。

 

image

 

image

 

加入成功之後就可以看到如下畫面。

 

image

 

用戶端要使用WCF服務,必須要加入服務參考,請在ASP.Net專案上按右鍵->加入服務參考。

image

 

接著可以看到這個視窗。請點選下圖紅色方框處。

image

 

可以看到"方案中的服務"這個選項。

 

image

 

接著會自動將我們之前設計的WCF服務參考加入,但是在按下確定之前,請先思考一下命名空間,因為這關乎日後系統維護,在本篇中我們先設定其服務命名空間為:WcfService。

 

image

 

按下確定之後你就可以看到…錯誤畫面!目瞪口呆

 

image

 

接下來我們要一步步探索錯誤的原因,按下確定鈕之後可以看到如下圖。

 

image

image

 

看到這邊大家一定有疑問,為什麼會不支援net.tcp?

其實當我們加入服務參考的時候,眼尖的朋友們一定有發現到自己螢幕右小角突然跑出了一個虛擬的IIS,沒錯!因為WCF程式的特性,必定要有一個可以讓它寄宿的程式,而在預設的狀態下,它會自行啟動一個虛擬的IIS好讓WCF服務寄宿在上面,並且可以即時讓客戶端程式加入服務參考,這原本是微軟的一個美意,怕大家太麻煩,每次要加入服務參考都要先啟動一個虛擬IIS,所以就自行自動幫我們啟動起來,不過這也讓初期摸索的我一個頭兩個大。

 

經過查找發現到,VS2010所啟動的虛擬IIS其實是不支援TCP通訊協定的,所以會出現上圖的錯誤並不奇怪,也因此,我們必須改採另一種方式,也就是我在第二篇所使用的方法-佈署在IIS上

在進行快速本機IIS佈署前,請先確認您是以”系統管理員”的身份開啟VS2010,確認無誤後,請在WCF專案上按右鍵->屬性。

 

image

image

image

 

成功佈上IIS之後,再來要處理的就是最根本的問題,也就是讓IIS具有TCP的通訊能力(NamePipe、MSMQ啟用的作法以此類推),其過程有點複雜,大致上要經過三個確認項目:

 

1. IIS版本是7以上

2. 請確認已安裝下列三個項目

image

 

image

3. 確認服務:Net.TCP Listener Adapter是否啟動

image

 

確定好這三項之後,我們就可以開始對我們IIS上的WCF服務進行設定。

第一步、先設定站台的繫結。

image

 

image

第二步:設定WCF服務所啟用的協定

image

 

請在已啟用的通訊協定鍵入:http,net.tcp

 

image

 

按下確定之後,我們來確認一下服務是否可用。

image

image

接下來我們回到VS2010,並且再次對ASP.Net專案加入服務參考,不過這次的Url位址不太一樣呦!

image

image

 

接著我們就來撰寫一個簡單的程式碼吧!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AspClient.WcfService;
using System.ServiceModel;

namespace AspClient
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            using (ChannelFactory<IService1> cf = new ChannelFactory<IService1>("TCP")) //叫用TCP端點
            {
                IService1 sv = cf.CreateChannel();
                ClientScript.RegisterStartupScript(this.GetType(), Guid.NewGuid().ToString(), "alert('"+sv.GetData(10)+"');", true);
            }
        }
    }
}

接下來就是把ASP.Net專案設定成啟始專案。

 

image執行

image

 

再來,我們來審視一下程式碼,在程式碼中我們可以看其中關鍵性的一段:

using (ChannelFactory<IService1> cf = new ChannelFactory<IService1>("TCP"))

ChannelFactory一共有三個建構子,其中之一就是指定某個端點的名稱,也因此,使用者可以自由的呼叫某個端點,更甚至是可以動態呼叫端點,很棒吧!如果要看端點名稱,請打開ASP.Net專案的Web.config檔,其內容如下:

image