首先了解一下不同應用程序域中的對象的通信方式有兩種:
一種是跨應用程序域邊界傳輸對象副本。按值封送(marshal by value)
一種是使用代理交換消息。按引用封送(marshal by reference)
本機或者是服務器上的其實都是同一個實例,只不過是服務器創建后你在本地使用了那個對象而已。比如:
A類繼承了marshalbyrefobject,那么A類由服務器創建實例了,客戶端都可以使用這個實例了。假設A類有一個方法,Function返回值為一個string類型,這個方法有一系列的操作。客戶端在調用這個方法的時候只得到服務器返回的一個值,那個一系列的操作都將在服務器完成。
簡單來講,繼承此類的對象可以跨越應用程序域邊界被引用,甚至被遠程引用。
當一個對象需要長途跋涉到另一個環境中時,需要將其marshal(封送)成一個可以傳輸的形態(比如在.NET Remoting中對象將被打包成一個serializable的ObjRef實例——這個ByRef就是指ObjRef這種形態);同理,當打包以后傳輸到目標地點,還要執行unmarshal的操作將其還原為內存中的對象。
你實際上只擁有對這個對象的一個遠程引用,雖然你可以調用它的方法,但實際上這些操作都是發生在遠程的(就是前面講過的過程)。
別外解釋一下WebService,
Web services 使用 XML 來編解碼數據,並使用 SOAP(通信協議)來傳輸數據。大家可以發現WebService代理類的MarshalByRefObject對象的。
remoting 是MarshByReference的,可以傳變量的引用,直接對服務器對象操作。速度快,適合intranet(企業內部互聯網)。
webservice 是MarshByValue的,必須傳對象的值。速度慢,可以過FIREWALL,配置比較簡單,適合internet(因特網)。
概括的說Remoting與Web Services的區別是:
(1)既支持TCP信道又支持HTTP信道,傳輸速度快
(2)即可傳輸XML的SOAP包又可傳輸二進制流,效率高
(3)Remoteing主要用於C/S結構項目
(4)不一定要依賴IIS服務器
一般來說,remoting是和平台相關的,需要客戶和服務器都是.NET,但可配置特性比較好,可以自定義協議。web service可以做到跨平台通信,但必須采用SOAP協議。
從MarshalByRefObject派生的類和有[Serializable]的類都可以跨越應用程序域作為參數傳遞。
從MarshalByRefObject派生的類按引用封送,有[Serializable]標志的類,按值封送。
如果此類即從MarshalByRefObject派生,也有[Serializable]標志也是按引用封送。
轉自:https://www.cnblogs.com/CrabMan/p/5195377.html