上次以一個簡單例子帶我們領略了一下remoting的風采,今天我們逐步熟悉下remoting的基礎知識。
首先remoting是以通道來串連兩個應用程式定義域之間來進行通訊的,用戶端通過remoting訪問通道以獲得伺服器端遠程對象,再通過代理解析為用戶端對象。遠程對象代碼可以運行在伺服器上(分為伺服器端啟用的對象和用戶端啟用的對象),用戶端通過remoting串連伺服器,獲得該服務物件並通過序列化在用戶端運行
在remoting可以同時註冊多個通道的,但是必須採用不同的連接埠號碼和名稱來標示,因為名稱是通道的唯一標示符。
一 遠程對象
遠程對象啟用,分為用戶端啟用和伺服器端啟用
伺服器端啟用叫做WellKnow啟用,不過很多書翻譯成知名對象啟用方式,它在一個眾所盩厔的URI上發布這個類型,並且伺服器處理序回為此類型配置一個WellKnow對象,根據指定的地址和協議以及連接埠來發布對象。
即 RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteTest), "proname", WellKnownObjectMode.Singleton);
也可以是
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteTest), "proname", WellKnownObjectMode. SingleCall);
SingleCall和Singleton是代表兩中不同模式,
Singleton即為狀態模式,可以理解為所有用戶端公用一個對象,當它處於啟用狀態時,它會同時處理所有用戶端請求,而並不關注是否是同一個用戶端執行個體。
SingleCall對象即叫做無狀態模式,SingleCall是一種無狀態模式。一旦設定為SingleCall模式,則當用戶端調用遠程對象的方法時,Remoting會為每一個用戶端建立一個遠程對象執行個體,至於對象執行個體的銷毀則是由GC自動管理的。其實很象我們平時所經常見到的Session。
用戶端啟用與WellKnown模式不同,Remoting在啟用每個對象執行個體的時候,會給它會分別指派一個URI給用戶端啟用類型,一旦獲得用戶端的請求,將為每一個用戶端都建立一個執行個體引用。另外,SingleCall和用戶端啟用物件執行個體建立的時間不一樣。用戶端啟用方式是客戶一旦發出調用的請求,就執行個體化;而SingleCall則是要等到調用對象方法時再建立。其次,SingleCall模式啟用的對象是無狀態的,對象生命期的管理是由GC管理的,而用戶端啟用的對象則有狀態,其生命週期可自訂。其三,兩種啟用模式在伺服器端和用戶端實現的方法不一樣。尤其是在用戶端,SingleCall模式是由GetObject()來啟用,它調用對象預設的建構函式。而用戶端啟用模式,則通過CreateInstance()來啟用,它可以傳遞參數,所以可以調用自訂的建構函式來建立執行個體。
對於用戶端啟用模式有兩種方法:
1) 調用RemotingConfiguration的靜態方法RegisterActivatedClientType()。這個方法傳回值為Void,它只是將遠程對象註冊在用戶端而已。具體的執行個體化還需要調用對象類的建構函式。
RemotingConfiguration.RegisterActivatedClientType(
typeof(RemoteTest), "tcp://192.168.168.165:8081/proname ");
RemoteTest serverObj = new RemoteTest();
2) 調用進程Activator的CreateInstance()方法。這個方法將建立方法參數指定類型的類對象。它與前面的GetObject()不同的是,它要在用戶端調用建構函式,而GetObject()只是獲得對象,而建立執行個體是在伺服器端完成的。CreateInstance()方法有很多個重載,我著重說一下其中常用的幾個。
《1》 public static object CreateInstance(Type type, object[] args, object[] activationAttributes);
Args[]傳遞的其實就是構造方法的參數
《2》public static ObjectHandle CreateInstance(string assemblyName, string typeName, object[] activationAttribute);
《3》 public static ObjectHandle CreateInstance(Type type);
《4》 public static ObjectHandle CreateInstance(Type type,bool nonPulic);
其實在日常使用中,以上只是帶領大家瞭解了下remoting基礎知識,在實際應用中,如果傳遞自訂對象,與中繼資料的相關性,介面知識的融合,都需要我們好好的融會貫通。
偶希望“我丟出一塊磚頭,有玉的砸過來吧!”