WCF入門三[WCF宿主]
一、概述
WCF程式必須在宿主上執行,也就是WCF服務必須寄宿在某一個windows的程序中,可以是IIS、控制檯程式、窗體程式、WAS以及所有.net程式等程式程序中。在我用VS2013建立WCF服務的時候有四個型別:WCF服務庫、WCF服務應用程式、WCF工作流服務應用程式和聯合服務庫。現在處於初學階段,主要學習用到的是WCF服務庫和WCF服務應用程式,它們有什麼區別呢?
1.WCF服務庫:相當於一個包含WCF服務的類庫,本身不能執行,必須通過別的宿主程式(如控制檯程式、WAS等)託管引用後才可以使用,可以提高程式碼的複用性。
2.WCF服務應用程式:相比之下可以獨立執行,基於IIS託管的程式。在開發基於IIS的WCF服務時比較多見,自學的時候也多用這個,在
IIS的宿主實現在之前講過,所以不再複述。這裡我們先建立一個WCF服務庫WcfServiceLibrary,將預設的檔案IService1.cs和Service.cs刪除,新建一個WCF服務Day.cs會生成Day,cs和IDay.cs兩個檔案,介面和實現如下:
namespace WcfServiceLibrary { [ServiceContract] public interface IDay { [OperationContract] string ShowDay(int day); } }namespace WcfServiceLibrary { public class Day : IDay { public string ShowDay(int day) { return string.Format("WCF服務返回Day是:{0}", day); } } }
這裡我們在新建WCF服務Day.cs的時候VS自動給在配置檔案中加上了該服務的資訊,也就是終結點的資訊。這裡和寄宿在IIS中由IIS監聽不同,如果沒有新增的話需要手動新增在配置檔案中或者在程式程式碼中寫終結點的相關配置細資訊Behaviors、Address等,不過正常情況下都是依賴配置檔案的。
由於控制檯程式、窗體程式、windows服務和.net程式等作為宿主都是一樣的,可以通過讀取配置檔案或者程式碼配置終結點等服務資訊來實現。以下主要用控制檯程式通過這兩點實現WCF宿主。
二、程式碼配置終結點資訊
1.在解決方案下新建一個控制檯程式ConsoleApplication。
2.新增引用->解決方案->WcfServiceLibrary.dll。
3.新增引用->程式集->System.ServiceModel。
namespace ConsoleApplication { class Program { static void Main(string[] args) { //建立宿主的基地址 Uri baseAddress = new Uri("http://192.168.3.30:8080/Day"); //建立宿主 using (ServiceHost host = new ServiceHost(typeof(Day), baseAddress)) { //向宿主中新增終結點 host.AddServiceEndpoint(typeof(IDay), new WSHttpBinding(), ""); //將HttpGetEnabled屬性設定為true ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; //將行為新增到Behaviors中 host.Description.Behaviors.Add(smb); //開啟宿主服務 host.Open(); Console.WriteLine("WCF中的HTTP監聽已啟動...."); Console.ReadLine(); host.Close(); } } } }
6.啟動控制檯程式,如果啟動不了的話,用管理員身份執行exe,啟動WCF服務。
7.新建一個控制檯解決方案,並新增地址為http://192.168.3.30:8080/Day的服務引用。之後正常呼叫服務如下所示:
三、讀取配置檔案
1、2、3三個步驟同上,更改程式碼如下,這裡是直接讀取配置檔案中的ServiceHost:
class Program { static void Main(string[] args) { ServiceHost host = new ServiceHost(typeof(Day)); //開啟宿主 host.Open(); Console.Write("WCF中的HTTP監聽已啟動...."); Console.ReadKey(); host.Close(); } }
在控制檯應用程式的配置檔案App.Config修改如下,這裡的配置項必須要對否則啟動會報錯。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.serviceModel> <services> <service name="WcfServiceLibrary.Day"> <endpoint address="" binding="wsHttpBinding" contract="WcfServiceLibrary.IDay" /> <host> <baseAddresses> <add baseAddress="http://192.168.3.30:8080/Day" /> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="True"/> <serviceDebug includeExceptionDetailInFaults="False"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
重複同上使用WCF服務。
四、總結
實現控制檯宿主、winform宿主和windows服務宿主的程式碼就是以上兩種方式,雖然宿主不同但是方法其實是相同的,可以根據以上的控制檯宿主的實現來實現其他同類型的宿主,但是相比之下用IIS服務作為宿主還是最為主要的手段,更加的方便快捷。
五、說明
這個隨筆是我自己學習流程的一個記錄,和大家共勉。