【.NetRemoting】2015.09.16
【分布式應用程序】
應用程序分布在不同計算機上,通過網絡來共同完成一項任務
C/S架構[模式]
【互操作性,Interoperability】又稱【互用性】
是指不同的計算機系統、網絡、操作系統和應用程序一起工作並共享信息的能力。
【.Net網絡編程技術】
WCF,Web Service,Remoting,Socket
【應用程序域,AppDomian,Application Domain】
1.【緣由】
【1】.Net程序集需要運行在托管環境中
【2】操作系統並不了解托管代碼
【3】需要有一個中介,既能為程序集提供托管環境,又能運行在非托管的操作系統的進程之內==>AppDomian;
【4】所有.Net程序集都運行在AppDomain
2.
【應用程序域是運行為它加載的程序集訪問.Net CLR提供的服務的】
【.Net提供的運行時服務】
托管堆,GC,JIT編譯器,程序集加載器等
3.
【1】可以將AppDomian類比為一個輕量級的進程,
【2】一個線程可以有多個AppDomian
【3】【默認的應用程序域】+【其他的應用程序域】
【4】應用程序域提供與進程類似的隔離性
4.創建AppDomian的優勢
【進程創建一個AppDomian比操作系統創建一個進程的開銷要小】
5.應用程序域的基本操作
【1】獲取當前運行代碼/程序集所在的AppDomian
AppDomian.CurrentDomain;
Thread.GetDomain();
【2】獲取應用程序域的名稱
FriendlyName
【3】創建新的應用程序域
AppDomian.CreareDomain("AppDomianName");
【4】在應用程序域中創建對象
【A】使用CreateInstanceAndUnWrap()方法;
【B】使用CreateInstance()方法創建對象
【5】判斷是否是默認AppDomian
IsDefaultAppDomain();
【默認的程序域】
【1】線程創建時即被創建
【2】無法卸載,與所在的進程同生同滅
【在默認程序域中創建對象】
【在新建的應用程序域中創建對象】
對象從另外一個AppDomian中傳遞給本地AppDomian
需要對傳遞的對象進行序列化
【思考】
如何使用應用程序域動態的加載一個程序集
【代理,Proxy】
【1】在應用程序域中創建對象和使用構造函數創建對象的區別?
【構造函數】
在堆中直接創建一個對象,由變量名直接引用到對象
【在應用程序域中創建對象】
【1】在應用程序域中創建對象
【2】將對象序列化後封送【Marshaling】到本地/客戶端應用程序域==>【遠程對象】
【3】客戶端應用程序域重新創建對象,還原對象狀態,==>創建對象代理【Proxy】,【代理對象】
【4】客戶端通過代理對象訪問遠程對象
【Proxy】提供了和遠程對象完全相同的接口。
客戶端基於遠程對象的類型元數據來創建代理,因此客戶端必須包含遠程對象的類型元數據
【元數據】
類型得接口,包含名稱,簽名,不包括實現代碼
【代理對象】newAppDomain中創建的對象
【遠程對象】客戶端應用程序域中創建的對象
【封送,Marshal】==>2中方式,傳值,傳引用
【傳值封送,Marshal By Value】將對象傳遞到客戶端
【傳引用封送,Marshal By reference】將對象依舊留在遠程AppDomian中,創建代理,通過代理訪問遠程對象
【傳引用封送的方式】【有三種方式】
【1】客戶端激活【Client activated】==>客戶端激活對象,CAO,Client activated Object
【2】服務端激活Singleton【Service activated Singleton】
【3】服務端激活SingleCall【Service activated SingleCall】
【傳引用封送】==>MBR對象
【MarshalByRefObject對象】
需要封送的對象必須要繼承MBR類
【當一個對象繼承自MBR之後,標志著該對象永遠無法離開他所在的應用程序域】
【傳引用封送和傳值封送的優勢】
對象大時候,傳值封送的效率要低,傳值封送需要將對象序列化,將整個對象封送到客戶端,增加了網絡負擔。。。
【Remoting】
跨應用程序域的訪問都屬於Remoting。
【無論AppDomian是在同一個進程內,還是同一個主機不同進程內的AppDomian,還是不同計算機的進程】
【客戶端】
發出請求的一端
【服務端】
提供類型的一端
【一個典型的Remoting程序】
【1】【服務程序集,提供服務的類型】
==>這些類型通常繼承自MBR,[傳引用封送的優勢]
【2】【服務端應用程序】==>【宿主應用程序域】
==>提供服務程序集運行的環境【IIS,Windows服務,控制台程序,winform窗體程序等等】
【3】【客戶端應用程序域】
==>向宿主應用程序域發出請求的應用程序域