在WCF中,一個用戶端應用程式要使用一個已經部署好的WCF服務,它就必須知道幾個關於這個服務的資料,稱之為服務的中繼資料。這些中繼資料套件括:1)服務契約的中繼資料;2)服務的訪問地址;3)服務訪問方式的配置。在上一篇文章的操作樣本中,我使用直接複製代碼的方式,把服務契約的中繼資料公開給客戶應用程式,訪問地址使用硬式編碼方式在客戶應用程式代碼中編寫;服務的訪問方式使用標準綁定中的BasicHttpBindng,同樣是在客戶應用程式中寫入程式碼確定。
綜上所說,在上一個操作樣本中,我公開服務中繼資料的方式之所以有效是因為我同時開發服務和客戶應用程式。但是在真正的系統開發中,大部分情況裡,服務開發商跟客戶應用程式開發商是不相同的,團隊不一樣,甚至開發所使用的技術也不一樣。今天我所講述的主要內容是使用Visual Studio裡面的加入服務參考功能來擷取服務的中繼資料,這種方式對於服務Team Dev,客戶應用Team Dev都使用Visual Studio非常有效率。 開始我今天的操作樣本,首先編寫一個服務契約。在Visual Studio 2008中建立一個解決方案,首個項目選擇WCF Service Library。命名為WCFStudy8。建立項目後刪除內建的App.config,IService.cs,Service.cs檔案。添加介面代碼檔案ICalculationService.cs,其內容如下:
代碼
using System; using System.ServiceModel; namespace WCFStudy8{ [ServiceContract(Namespace="http://www.WCFStudy8.net/2009/08/06")] public interface ICalculationService { [OperationContract] int Sum(params int[] numbers); }}建立了服務契約之後,添加實現該契約的服務,類代碼檔案CalculationService.cs,其內容如下: 代碼
using System;namespace WCFStudy8{ public class CalculationService : ICalculationService { #region ICalculationService Members public int Sum(params int[] numbers) { int result = 0; foreach (int n in numbers) { result += n; } return result; }#endregion }} 建立一個項目,該項目用於寄存這個WCF服務,簡單起見,我選擇Windows控制台程式項目,命名為Host。(使用比較複雜的應用程式寄存服務的細節,在以後會講述)在Host項目的Program.cs檔案中編寫以下代碼:代碼
using System; using System.ServiceModel; namespace Host{ class Program { static void Main(string[] args) { using(ServiceHost host = new ServiceHost(typeof(WCFStudy8.CalculationService))) { host.Open(); Console.WriteLine("Host is on the run,press any key to close it."); Console.ReadLine(); } } }}
然後,為Host項目添加一個應用程式設定檔App.config,在這個檔案中,我會佈建服務的部署資料,並且使用WCF Configration配置軟體來編輯配置。值的一說的是,這個配置軟體對於學習如何配置WCF比較有用,但使用這個軟體所做的配置,完全是由理由手動輸入到設定檔中的(只要往後對WCF的配置夠熟悉)。因此,我不打算詳細地講述這個軟體的使用。以片展示怎樣啟動該軟體。
這個軟體同樣可以在.NET Framework SDKs的檔案夾中找到,隨.NET 3.0一起安裝,在我的電腦中的位置是:C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\SvcConfigEditor.exe對App.config開啟該軟體後,進入介面如下,選擇Create a New Service...,將會引導建立服務:選擇建立新服務後,要求選擇新服務實現的服務契約,通過點擊Browser按鈕,找到ICalculationService所在的程式集,並選擇之:選擇好服務實現的服務契約之後,軟體要求你選擇服務使用的協議類型,這裡我選擇Http協議,當然其實這個協議只是一個公開端點的使用的協議,千萬不要以為這個協議代表格服務,協議只是對應於端點,而不是服務,而且我選擇基本Http協議:選擇好端點協議之後,軟體要求你為端點輸入一個地址,它給你的預設文本是“http://”如果你打算在這後面添加地址,那麼個端點的地址將會是一個絕對位址。而好的習慣是為服務設定基地址,讓端點使用相對位址,這樣在修改網域名稱的時候只需要修改服務基地址,而不需要逐個端點地址修改。我為端點設定地址為“Calculation”: 設定好端點地址之後,建立服務的流程就結束了,但這不意味著佈建服務部署結束了。接下來就進入服務部署的配置,同樣是使用該軟體 剛開始的時候,在剛才建立服務過程中建立的端點只有地址,沒有名字,我使用軟體給了它一個名字,不過跟地址相同(當然這個完全不是必要的),端點名字的設定也會反映到整個服務的中繼資料中。 現在,我需要為這個服務添加一個
服務端行為,什麼是服務端行為,在往後講述,現在你可以先把它理解作屬於這個服務特有的功能。選擇軟體介面中的節點路徑:
Advanced -> Service Behaviors ,然後在右邊的介面中點擊
New Service Behavior Configration...進入編輯介面,我為這個新增服務端行為 設定名字叫metaBehavior,並為它添加一個
serviceMetadata元素:配置完服務端行為,點擊這個新增行為的serviceMetadata元素,設定HttpGetEnabled屬性為true,設定了這個屬性,才能通過http協議的串連訪問行為的這個元素。 終於來到了最後一步,配置擷取中繼資料的服務端點,這裡先解釋一下。這個擷取中繼資料的端點,就是將會被Visual Studio加入服務參考功能使用的端點,通過這個端點,客戶應用程式開發人員可以擷取服務相關的所有中繼資料。包括我在文章開篇所提到的三個服務中繼資料。這個端點之所以可以向客戶提供中繼資料,全因為我剛才設定的服務端行為,更精確地說,是因為serviceMetadata元素。目前為止,讀者只需要瞭解到這個成都。選擇節點 Services -> Endpoints ,右擊建立新端點。端點名字我改為mex,地址也設定為mex,公開的服務契約為IMetadataExchange,這個契約定義在System.ServiceModel.dll程式集中,同時我為這個端點選擇綁定為mexHttpBinding,所有設定如:到了現在,作最後一個配置,就是為這個服務設定它的服務端行為,很明顯這個行為就是我剛才增加的行為: 好了,到了現在我們已經設定了所有服務部署的配置。看似很麻煩,很費時間,其實只要熟練了,一下子就可以配置好了。配置完成之後儲存一下,然後回到Visual Studio 2008的介面,會提示有檔案在外部被修改,是否反映修改的部分,當然選擇 Yes to all了。至此,我們已經配置了服務,現在看一下App.config檔案的變化,以下是其內容:
代碼
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="metaBehavior"> <serviceMetadata httpGetEnabled="true" /> </behavior> </serviceBehaviors> </behaviors> <services> <service name="WCFStudy8.CalculationService"><endpoint address="Calculation" binding="basicHttpBinding" bindingConfiguration="" name="Calculation" contract="WCFStudy8.ICalculationService" /><endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""name="mex" contract="IMetadataExchange" /></service></services></system.serviceModel></configuration> 這個設定檔中的內容會在服務宿主進程啟動時被載入,並用於初始化服務,也就是說,通過設定檔,開發人員不需要在程式編碼中設定服務宿主的各個屬性(當然要設定也是可以的)。設定檔中的屬性,往後在講到相關內容時會講述。可以看出,已經反映了我剛才在軟體中的配置。目前,還需要的就是客戶應用擷取中繼資料。我將在下一篇文章中繼續這個內容。