【Remoting-4】


【服務對象三種激活方式的不一樣】
【1】客戶端激活方式
【A】對象的建立,對象方法的執行都是在遠程服務端。
【B】服務端爲每個客戶端建立其專屬的對象,爲這個客戶提供服務,而且保存狀態
【C】能夠從遠程獲取到方法執行的返回值
【D】使用客戶激活方式時候,遠程對象在調用new操做時被建立[敘述了遠程對象什麼時候在服務端被建立]dom

【2】服務端激活方式--Singleton
【A】在服務端,服務對象的構造函數只會被調用一次
【B】後繼的請求都使用該對象進行服務。==>【有狀態】的激活模式
【C】多個客戶端共享一個遠程對象【的狀態】。
【D】在【客戶端】即時使用new操做符,【服務端】也不會建立一個對象,
只有在【客戶端代理】中對象【代理對象】第一次調用方法時,對象在服務端纔會被建立。
==>服務端只會建立一個服務對象函數

【3】服務端激活-SingleCall
【A】對象對每一次方法調用提供服務。
==>對於客戶端的每一次方法調用,服務端都會建立一個對象爲其服務,在方法執行完畢以後,在銷燬對象。
【B】SingleCall沒法保存對象狀態==>【無狀態】激活模式。
==>若是保存對象的狀態?==>解決方法:將對象狀態存儲在對象以外。
【C】在【客戶端】即時使用new操做符,【服務端】也不會建立一個對象,
只有在【客戶端代理】中對象【代理對象】調用方法時,對象在服務端纔會被建立。
==>每一次調用方法,服務端都會建立一個服務對象工具

【Remoting的傳值封送】
【1】須要將對象標誌位可序列化
【2】構建一個工廠類做爲遠程服務對象,而後將實際要傳值封送到客戶端的對象做爲過程方法的返回值。
【3】徹底沒有必要,若是要將遠程對象傳值封送到客戶端,Remoting存在還有什麼意義呢?url

【分離服務程序集元數據和代碼實現】
如何將【宿主應用程序域,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】
==>解決了直接使用接口時沒法建立客戶端激活對象的問題 pdo

本站公眾號
   歡迎關注本站公眾號,獲取更多信息