程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【Remoting-4】,remoting-4

【Remoting-4】,remoting-4

編輯:C#入門知識

【Remoting-4】,remoting-4



【服務對象三種激活方式的不同】
【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】
==>解決了直接使用接口時無法創建客戶端激活對象的問題

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved