發表文章

目前顯示的是有「.Net Remoting」標籤的文章

初試.NET Remoting

圖片
雖然使用.NET Remoting已經一陣子了,不過,最近對於它的生命週期的議題有點疑惑。所以就想說自已寫一個簡單的Remoting來測試一下。如果想看英文的.NET Remoting相關文章的話,可以參考 這篇 。 首先因為Remoting物件是需要在兩個不同的AppDomain中使用的,所以這個物件的定義應該是要讓Remoting Server及Remoting Client兩邊都能認得。要達到這樣的目的,一種作法就是在專案中建立一個「類別庫」。在這個類別庫中,定義一個介面。例如本範例中的IRemoteServer: 接著再新增一個主控台專案來實作一個RemoteServer: 上面只是用先前定義的IRemoteServer介面實作出一個伺服器而已。這個伺服器類別除了要實作IRemoteServer外,另外還要再繼承自MarshalByRefObject。一般而言,只要繼承MarshalByRefObject類別就好了,不用再另外寫其它的程式碼。這樣的伺服器就可以使用了。 而在這裏的範例中,我另外還覆寫了MarshalByRefObject的InitializeLieftimeService()這個函式。主要的用意就是要在覆寫的函式中傳回一個null值,表示這個Marshal By Reference的物件它的「租約」是無限期的。這樣.NET中的GC就不會自動回收這個物件了。 實作完伺服器類別後,接著就是要寫一段程式碼就它能被註冊成運作中的伺服器。 要註冊一個Remoting的伺服器,一開始就是要先決定所要使用的通訊協定。通訊協定主要有兩種型式,一種是HTTP;另一種是TCP。在這個範例中,我是選擇使用TCP。當然你也可以選用HTTP。 建立好Channel物件後,再用ChannelServices.RegisterChannel()來註冊這個通道。 最後就是利用RemotingConfiguration.RegisterWellKnownServiceType()這個函式來註冊你要用來在上面所註冊的通道中提供服務的伺服器。需要給的參數有:   伺服器類別的型別 提供服務的服務名稱,也是一個識別碼 建立伺服器物件時的型式 Singleton:只會產生一個伺服器物件來服務每次連線進來的要求 SingleCoall:每次連線進來的要求都會建立一個...