WCF學習心得----(四)服務承載
這一章節花費了好長的時間才整理個大概,主要原因是初次接觸這個東西,在做練習實踐的過程中,遇到了很多的問題,有些問題到目前還沒有得以解決。所以在這一章節中,有一個承載是沒有例子的。仍在努力解決所在的問題,后續會把例子給補上的。好了,進入正題。
要變為活動狀態,服務必須承載於創建它並控制它的上下文和生存周期的運行環境中。WCF有以下三種承載方式:在IIS中承載、在Windows進程激活(WAS)中承載、在托管應用程序中承載(自承載)。下面就分別對這三種承載方式,一一介紹。
1. 在IIS中承載
1.1 概述
WCF可以方便的通過IIS承載,此承載模型與ASP.NET和ASP.NET Web Service使用的模型類似,都是通過HTTP協議進行激活和網絡通信的。
WCF可以在Windows XP SP2上的IIS5.1、Windows Server2003上的IIS 6.0、Windows 7和Windows Server 2008的IIS 7.0上承載。
1.2 優點
1) 可以向處理其他任何類型的IIS應用程序一樣,部署和管理IIS中承載的WCF服務。
2) IIS提供進程激活、運行狀態管理和回收功能以提高承載的應用程序的可靠性。
3) 像ASP.NET一樣,ASP.NET中承載的WCF服務可以利用ASP.NET共享宿主模型,在此模型中,多個應用程序駐留在一個公共輔助進程中以提高服務器密度和可伸縮性。
4) IIS中承載的WCF服務與ASP.NET2.0使用相同的動態編譯模型,該模型簡化了承載服務的開發和部署。
5) IIS承載WCF服務時,IIS5.1和IIS6.0僅限於HTTP通信。
1.3 部署IIS承載WCF服務示例
1.3.1 確保正確安裝和注冊IIS、WCF、WCF HTTP激活組件。
方法如下:控制面板—>所有面板項—>程序和功能—>打開或關閉Windows功能—>
將如上圖所示的項勾選即可。
當然除了在打開或關閉Windows功能面板里邊勾選之外,我們還可以通過命令在dos窗口里激活組件,由於操作起來不如直接在windows功能里勾選方便,所以這里就不再列出相應的激活命令了,有興趣的朋友可以下去自己在網上搜一下。
1.3.2 具體代碼演示
1.3.2.1 新建WCFService客戶端,WCF服務程序
1.3.2.1.1目錄結構如下:
1.3.2.1.2 在ICalculatorService.cs中代碼如下,該文件主要用來定制服務的協定
[ServiceContract(Namespace=”WCFService”)] public interface ICalculatorService { [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Mutiply(double n1, double n2); [OperationContract] double Devide(double n1, double n2); }
1.3.2.1.3 CalculatorService.svc.cs文件中代碼如下,該文件主要實現了服務定制的接口
public class CalculatorService : ICalculatorService { public double Add(double n1, double n2) { return n1 + n2; } public double Subtract(double n1, double n2) { return n1 - n2; } public double Mutiply(double n1, double n2) { return n1 * n2; } public double Devide(double n1, double n2) { return n1 / n2; } }
1.3.2.1.4 Web.config文件中代碼如下,該文件主要定制服務的配置
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> </system.web> <system.serviceModel> <services> //配置服務 <service name="WCFService.CalculatorService" behaviorConfiguration="CalculatorServiceBeheavior"> //配置服務的根節點 <endpoint address="" binding="wsHttpBinding" contract="WCFService.ICalculatorService"/> //配置元數據的根節點 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> //配置服務的行為,允許獲取元數據 <behavior name="CalculatorServiceBeheavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration>
1.3.2.2 在IIS中創建網站,將該服務端生成的如下圖紅框圈住的文件拷貝至網站虛擬目錄對應的物理路徑下
然后發布在瀏覽器中觀看如下圖:
這時還需要留意,瀏覽器中的url,如下:
1.3.2.3 使用Svcutil.exe工具生成客戶端調用類和配置文件
1.3.2.3.1打開命令行提示符工具,輸入一下命令,將目錄定位到Svcutil.exe所在的目錄。
Svcutil.exe目錄一般位於C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin文件夾下,所以命令如下:
Cd C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\
1.3.2.3.2 定位到該文件下之后,繼續鍵入以下命令:
Svcutil.exe /out:D:\CalculatorClient.cs /config:\D:App.config
http://localhost:116/CalculatorService.svc
備注:
Svcutil工具生成客戶端使用類有固定的語法參數,下面僅列出了該文所需的一些參數,至於其他的參數以后可能還會涉及到,有興趣的話可以去msdn上了解一些。
1) “/out:”后跟生成文件的存放路徑+文件名+.cs
2) “/config:”后跟生成文件的存放路徑+app.config
3) http://.... 為服務的地址,承載服務的應用程序運行起來時,Svcutil.exe通過該服務地址,生成下載客戶段使用類,該地址跟配置文件中的<host>節點下的地址是一致的。
1.3.2.4 新建WCF客戶端應用程序
1.3.2.4.1將1.3.2.3.中生成的CalculatorClient.cs文件和App.config文件添加到項目中
項目結構圖如下:
1.3.2.4.2 在Program.cs文件中使用客戶端調用類,調用服務端的服務
代碼如下:
class Program { static void Main(string[] args) { CalculatorServiceClient calculatorClient = new CalculatorServiceClient(); Console.WriteLine("{0}+{1}={2}", 1.2, 2.3, calculatorClient.Add(1.2, 2.3)); Console.WriteLine("{0}-{1}={2}", 2.3, 3.4, calculatorClient.Subtract(2.3, 3.4)); Console.WriteLine("{0}*{1}={2}", 3.4, 4.5, calculatorClient.Mutiply(3.4, 4.5)); Console.WriteLine("{0}/{1}={2}", 4.5, 3.0, calculatorClient.Devide(4.5, 3.0)); Console.WriteLine("OK! That's all!"); Console.Read(); } }
1.3.2.5 運行客戶端程序WCFClient
效果如圖:
2.在Windows進程激活服務(WAS)中承載
2.1 概述
Windows進程激活服務(WAS)管理輔助進程的激活和生存周期,該輔助進程包含WCF服務的應用程序。WAS進程模型通過移除對HTTP的依賴性使HTTP服務器的IIS6.0進程模型通用化,允許WCF服務在宿主環境中同時使用HTTP和非HTTP協議(例:NET.TCP),該宿主環境支持基於消息的激活並提供在給定計算機上承載大量應用程序的能力。
2.2 優點
1) 基於消息的應用程序激活和輔助進程應用程序會動態的啟動和停止,以響應使用HTTP和非HTTP網絡協議送達的傳入工作項
2) 可靠的應用程序和輔助進程回收可以使應用程序保持良好的運行狀況
3) 集中的應用程序配置和管理
4) 允許應用程序利用IIS進程模型,而無需完全IIS安裝部署的需求量。
2.3 在WA中承載WCF服務示例
2.3.1 確保正確的安裝了所需的WCF激活組件
方法如下:方法如下:控制面板—>所有面板項—>程序和功能—>打開或關閉Windows功能—>
將如上圖所示的項勾選即可。另有通過命令激活的方法,這里不作詳解。
2.3.2 代碼演示
略(待續)
3.在托管的應用程序中承載(自承載)
3.1 概述
服務可以承載於任何.NET Framework應用程序中。
自承載服務時最靈活的宿主選項,因為此服務部署所需要的基礎結構最少,但是該服務也是最不可靠的宿主選項。
3.2 優點
服務部署所需基礎結構最少,是最為靈活的宿主選項
3.3 在托管的應用程序中承載WCF服務示例
3.3.1 新建控制台應用程序命名為ZWCFService,作為服務的承載程序,主要的目錄結構如下:
具體的編碼實現如下,編碼實現之后要確保該程序運行起來,這樣才能夠獲取到該服務
3.3.1.1 在Program.cs中編碼如下:
class Program { static void Main(string[] args) { using(ServiceHost serviceHost=new ServiceHost (typeof(CalculatorService))) { serviceHost.Open(); Console.WriteLine("This service is ok!"); Console.WriteLine("Press any key to teiminate the service!"); Console.WriteLine(); Console.Read(); } } } [ServiceContract(Namespace="http://ZWCFService")] public interface ICalculatorService { [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Mutiply(double n1, double n2); [OperationContract] double Devide(double n1, double n2); } public class CalculatorService : ICalculatorService { public double Add(double n1, double n2) { double result = n1 + n2; Console.WriteLine("{0}+{1}={2}", n1, n2, result); return result; } public double Subtract(double n1, double n2) { double result = n1 - n2; Console.WriteLine("{0}-{1}={2}", n1, n2, result); return result; } public double Mutiply(double n1, double n2) { double result = n1 * n2; Console.WriteLine("{0}*{1}={2}", n1, n2, result); return result; } public double Devide(double n1, double n2) { double result = n1 / n2; Console.WriteLine("{0}/{1}={2}", n1, n2, result); return result; } }
3.3.1.2 App.config配置文件中代碼如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="ZWCFService.CalculatorService" behaviorConfiguration="CalculatorServiceBeheavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/ZWCFService/CalculatorService"/>
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="ZWCFService.ICalculatorService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBeheavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
3.3.2 使用Svcutil.exe工具生成CalculatorClinet類文件和app配置文件
3.3.2.1 打開命令行提示符工具,輸入一下命令,將目錄定位到Svcutil.exe所在的目錄。
Svcutil.exe目錄一般位於C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin文件夾下,所以命令如下:
Cd C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\
3.3.2.2 定位到該文件下之后,繼續鍵入以下命令:
Svcutil.exe /out:C:\CalculatorClient.cs /config:\C:App.config
http://localhost:8000/ZWCFService/CalculatorService
備注:
Svcutil工具生成客戶端使用類有固定的語法參數,下面僅列出了該文所需的一些參數,至於其他的參數以后可能還會涉及到,有興趣的話可以去msdn上了解一些。
1) “/out:”后跟生成文件的存放路徑+文件名+.cs
2) “/config:”后跟生成文件的存放路徑+app.config
3) http://.... 為服務的地址,承載服務的應用程序運行起來時,Svcutil.exe通過該服務地址,生成下載客戶段使用類,該地址跟配置文件中的<host>節點下的地址是一致的。
3.3.3 新建一個名為ZCWFServiceClient客戶端應用程序(控制台或winform應用程序均可)
3.3.3.1 將3.3.2中生成的客戶端使用類和配置文件,添加到當前項目中
客戶端項目的目錄結構如下:
3.3.3.2 在Program.cs文件中編碼如下,調用服務的方法
class Program { static void Main(string[] args) { CalculatorServiceClient calculator = new CalculatorServiceClient(); Console.WriteLine("{0}+{1}={2}",1.2,2,3,calculator.Add(1.2, 2.3)); Console.WriteLine("{0}-{1}={2}",3.4,2.3,calculator.Subtract(3.4, 2.3)); Console.WriteLine("{0}*{1}={2}",4.5,3.4,calculator.Mutiply(4.5, 3.4)); Console.WriteLine("{0}/{1}={2}",5.6,4.0,calculator.Devide(5.6, 4.0)); Console.WriteLine("Operation Over"); Console.WriteLine("Press any key to terminate the Console"); Console.Read(); } }
3.3.4 運行調試
3.3.4.1 先啟動服務端程序ZWCFService
結果如下:
3.3.4.2 再啟動客戶端程序
如果客戶端和服務端程序在同一個解決方案中,可將服務端設置為啟動項,待服務端啟動后,可以點擊客戶端右鍵—>調試-->啟動新示例
用這樣的方法來啟動客戶端,結果如下: