WCf是集大成者,具有其他微軟的很多技術(shù),其中分布式上很多借助于Remoting,所以研究一下Remoting有助于理解WCF
提到Remoting就不得不涉及到MarshalByRefObject這個(gè)對象,網(wǎng)絡(luò)上對這個(gè)詞語的解釋非常的模糊不清,特別是說“跨域訪問,Remoting是引用傳遞,不是值傳遞”,而沒有講“引用傳遞”到底是傳的什么東西,有的地方確實(shí)說了通過ObjRef對象 傳遞需要交互的所有內(nèi)容信息,但是更多的是對“引用傳遞”沒有清楚的認(rèn)識(shí),或者說是通過其他方式來理解“引用傳遞”而不是通過“引用傳遞”來更好的理解Remoting,這種邏輯思維方式,特別容易產(chǎn)生囫圇吞棗的模糊概念,看似明白,其實(shí)不明白。
為了理解引用傳遞,寫了一個(gè)例子,可能有助于理解 代碼
定義Interface
public interface ipersonService { String HelloMethod(String name); }
定義 Implement
public class PersonService : MarshalByRefObject, IPersonService{ public String HelloMethod(String name) { Console.WriteLine( "Server Hello.HelloMethod : {0}", name); return "Hi there " + name; }}定義Servicestatic void Main(string[] args) { //TCP協(xié)議傳輸消息的信道實(shí)現(xiàn) TcpChannel chan1 = new TcpChannel(8085); //為遠(yuǎn)程調(diào)用實(shí)現(xiàn)使用HTTP協(xié)議傳輸消息的客戶端通道 HttpChannel chan2 = new HttpChannel(8086); //提供幫助進(jìn)行遠(yuǎn)程處理信道注冊、解析和URL發(fā)現(xiàn)的靜態(tài)方法。無法繼承此類 ChannelServices.RegisterChannel(chan1, false); ChannelServices.RegisterChannel(chan2, false); //提供多種配置遠(yuǎn)程結(jié)構(gòu)的靜態(tài)方法 RemotingConfiguration.RegisterWellKnownServiceType ( //typeof(HelloServer), typeof(PersonService), "SayHello", WellKnownObjectMode.Singleton ); System.Console.WriteLine("PRess Enter key to exit"); System.Console.ReadLine(); }定義Clientclass Program { static void Main(string[] args) { TcpChannel chan1 = new TcpChannel(); ChannelServices.RegisterChannel(chan1,false); //Activator包含特定的方法,用以在本地或從遠(yuǎn)程創(chuàng)建對象類型、或獲取對現(xiàn)有遠(yuǎn)程對象的引用。無法繼承此類 IPersonService obj1 = (IPersonService)Activator.GetObject( typeof(IPersonService),// typeof(HelloServer), "tcp://localhost:8085/SayHello"); if (obj1 == null) { System.Console.WriteLine( "Could not locate TCP server"); } //使用HTTP通道得到遠(yuǎn)程對象 HttpChannel chan2 = new HttpChannel(); ChannelServices.RegisterChannel(chan2,false); IPersonService obj2 = (IPersonService)Activator.GetObject( typeof(IPersonService),// typeof(HelloServer), "http://localhost:8086/SayHello"); if (obj2 == null) { System.Console.WriteLine( "Could not locate HTTP server"); } Console.WriteLine( "Client1 TCP HelloMethod {0}", obj1.HelloMethod("Caveman1")); Console.WriteLine( "Client2 HTTP HelloMethod {0}", obj2.HelloMethod("Caveman2")); Console.ReadLine(); } }注意,客戶端使用的 “IPersonService”接口,對于客戶端來講是不知道接口的實(shí)例類的,
客戶端方法的調(diào)用也只是通過Activator生成的代理對象把調(diào)用的信息、鏈接信息等等進(jìn)行打包,
服務(wù)端接收到打包過來的信息后,根據(jù)打包信息內(nèi)容,對相應(yīng)的類和方法進(jìn)行操作,比如:創(chuàng)建(調(diào)用)服務(wù)實(shí)體,對方法進(jìn)行調(diào)用,把返回值進(jìn)行打包并傳輸給客戶端端,里邊具體的邏輯還需要繼續(xù)研究
這里只想說明一點(diǎn),“Remoting傳輸?shù)囊谩保降资鞘裁匆馑迹獾谜`解。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注