【服務對象三種激活方式的不同】
【1】客戶端激活方式
【A】對象的創建,對象方法的執行都是在遠程服務端。
【B】服務端為每一個客戶端創建其專屬的對象,為這個客戶提供服務,並且保存狀態
【C】可以從遠程獲取到方法執行的返回值
【D】使用客戶激活方式時候,遠程對象在調用new操作時被創建[敘述了遠程對象何時在服務端被創建]
【2】服務端激活方式--Singleton
【A】在服務端,服務對象的構造函數只會被調用一次
【B】後繼的請求都使用該對象進行服務。==>【有狀態】的激活模式
【C】多個客戶端共享一個遠程對象【的狀態】。
【D】在【客戶端】即時使用new操作符,【服務端】也不會創建一個對象,
只有在【客戶端代理】中對象【代理對象】第一次調用方法時,對象在服務端才會被創建。
==>服務端只會創建一個服務對象
【3】服務端激活-SingleCall
【A】對象對每一次方法調用提供服務。
==>對於客戶端的每一次方法調用,服務端都會創建一個對象為其服務,在方法執行完畢之後,在銷毀對象。
【B】SingleCall無法保存對象狀態==>【無狀態】激活模式。
==>如果保存對象的狀態?==>解決方法:將對象狀態存儲在對象之外。
【C】在【客戶端】即時使用new操作符,【服務端】也不會創建一個對象,
只有在【客戶端代理】中對象【代理對象】調用方法時,對象在服務端才會被創建。
==>每一次調用方法,服務端都會創建一個服務對象
【Remoting的傳值封送】
【1】需要將對象標志位可序列化
【2】構建一個工廠類作為遠程服務對象,然後將實際要傳值封送到客戶端的對象作為過程方法的返回值。
【3】完全沒有必要,如果要將遠程對象傳值封送到客戶端,Remoting存在還有什麼意義呢?
【分離服務程序集元數據和代碼實現】
如何將【宿主應用程序域,Host Appdomain】和【客戶應用程序域 Client Appdomain】的服務程序集分離?
【1】使用接口分離服務程序集
==>將類型的元信息和類型的實現分離
【注意】無法創建客戶端激活對象
【A】Activator.GetObject()方法只適用與服務端激活方法
【B】Activator.CreateInstance()方法,作為參數的對象需要滿足兩個條件;(1)繼承MBR,(2)服務端需要為此類型進行注冊
【2】使用空類分離服務程序集
==>服務程序集包含的代碼量較少
【3】使用SoapSuds.exe工具分離程序集
==>生成一個"空類"程序集
【SoapSuds.exe】是.Net提供的一個工具,它允許客戶端通過輸入一個遠程對象的Url,然後生成一個dll程序集文件,這個文件包含了在客戶端穿件代理的全部元數據信息,
但是不包含任何具體的實現==>【"空類"程序集】
【如何使用SoapSuds.exe獲取dll文件?】
【1】服務啟動後,激活遠程對象。【注】
【A】激活的方式只能是服務激活對象[SingleCall/Singleton]
【B】使用Http通道,且消息格式器為SOAP格式器
【C】生成dll程序集之後,無論服務端使用哪種類型的協議或者是格式,客戶端都能訪問到遠程對象。【注】
【2】客戶端使用【vs命令提示】工具,使用soapsuds命令生成服務程序集
soapsuds {-url:schemaUrl | -types:type1,assemblyname[,serviceEndpoint] [;type2,assemblyname][...]] | -is:schemafile | -ia:assemblyfile} [options]
【==>soapsuds -url:serviceObjUrl?wsdl -oa:assemblyname.dll】
【4】使用工廠方法分離
==>接口分離的一種變種
【只適用於客戶端激活方式,但是表現形式上又像服務端激活一樣】
【因為是工廠類,所以服務端激活對象的方式幾乎都是采用Singleton】
==>解決了直接使用接口時無法創建客戶端激活對象的問題