欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

關于Remoting(續)

系統 2178 0

昨天寫了文章《關于Remoting》,感覺有些問題沒有說清楚。后來又看了一些文檔和書,整理了一下,就算是續吧。

其實我發現主要的問題還是集中在客戶端激活模式。我想再談談客戶端激活模式和服務器端激活模式兩者在代碼實現上的區別。這兩種模式在服務器監聽程序上的區別不大,前面那篇文章已經說得很清楚了,主要還是客戶端程序。為了讓概念不至于模糊混淆,我下面提到客戶端激活模式,用Activated;服務器激活模式,用WellKnown。

先從VS提供的方法來看:

WellKnown模式:Activator.GetObject()方法。它的返回值是方法參數里指定類型的對象實例。

ServerRemoteObject.IServerObjectserverObj = (ServerRemoteObject.IServerObject)
Activator.GetObject(
typeof (ServerRemoteObject.IServerObject),
" tcp://localhost:8080/ServiceMessage " );


Activated模式:
有兩種方法:
1、靜態方法:RemotingConfiguration.RegisterActivatedClientType()。這個方法返回值為Void,它只是將遠程對象注冊在客戶端而已。具體的實例化還需要調用對象類的構造函數。

RemotingConfiguration.RegisterActivatedClientType(
typeof (ServerRemoteObject.ServerObject),
" tcp://localhost:8080/ServiceMessage " );
ServerRemoteObject.ServerObjectserverObj
= new ServerRemoteObject.ServerObject();


2、Activator.CreateInstance()方法。這個方法將創建方法參數指定類型的類對象。它與前面的GetObject()不同的是,它要在客戶端調用構造函數,而GetObject()只是獲得對象,而創建實例是在服務器端完成的。CreateInstance()方法有很多個重載,我著重說一下其中常用的兩個。
1) public static object CreateInstance(Type type, object[] args, object[] activationAttributes);
參數說明:
type: 要創建的對象的類型。
args :與要調用構造函數的參數數量、順序和類型匹配的參數數組。如果 args 為空數組或空引用(Visual Basic 中為 Nothing ),則調用不帶任何參數的構造函數(默認構造函數)。
activationAttributes :包含一個或多個可以參與激活的屬性的數組。

這里的參數args是一個object[]數組類型。它可以傳遞要創建對象的構造函數中的參數。從這里其實可以得到一個結論:WellKnown激活模式所傳遞的遠程對象類,只能使用默認的構造函數;而Activated模式則可以用戶自定義構造函數。

activationAttributes參數在這個方法中通常用來傳遞服務器的url。
假設我們的遠程對象類ServerObject有個構造函數:

ServerObject( string pName, string pSex, int pAge)
{
name
= pName;
sex
= pSex;
age
= pAge;
}

那么實現的代碼是:

object []attrs = { new UrlAttribute( " tcp://localhost:8080/ServiceMessage " )} ;
object []objs = new object [ 3 ];
objs[
0 ] = " wayfarer " ;
objs[
1 ] = " male " ;
objs[
2 ] = 28 ;
ServerRemoteObject.ServerObject
= Activator.CreateInstance(
typeof (ServerRemoteObject.ServerObject),
objs,attrs);

可以看到,objs[]數組傳遞的就是構造函數的參數。

2、public static ObjectHandle CreateInstance(string assemblyName, string typeName, object[] activationAttribute);

參數說明:

assemblyName
將在其中查找名為 typeName 的類型的程序集的名稱。如果 assemblyName 為空引用(Visual Basic 中為 Nothing ),則搜索正在執行的程序集。
typeName
首選類型的名稱。
activationAttributes
包含一個或多個可以參與激活的屬性的數組。

參數說明一目了然。注意這個方法返回值為ObjectHandle類型,因此代碼與前不同::

object []attrs = { new UrlAttribute( " tcp://localhost:8080/EchoMessage " )} ;
ObjectHandlehandle
= Activator.CreateInstance( " ServerRemoteObject " , " ServerRemoteObject.ServerObject " ,attrs);
ServerRemoteObject.ServerObjectobj
= (ServerRemoteObject.ServerObject)handle.Unwrap();

那么,這個方法實際上是調用的默認構造函數。ObjectHandle.Unwrap()方法是返回被包裝的對象。

說明:要使用UrlAttribute,還需要在命名空間中添加:using System.Runtime.Remoting.Activation;

通過這些代碼的比較,我們還可以得到一個不幸的結論:

對于Activated激活模式,不管是使用靜態方法,還是使用CreateInstance()方法,都必須在客戶端調用構造函數實例化對象。這樣一來,在客戶端我們提供的遠程對象,就不可能只提供接口,而沒有類的實現。而在WellKnown模式,因為在客戶端只是用GetObject()獲得對象,實例化是在服務器端完成的。所以客戶端我們只提供接口就夠了。

所以對于Activated模式,我們必須在服務器和客戶端提供兩份完全相同的遠程對象Dll,這個結果確實讓人很沮喪。有沒有其他方法實現呢?鑒于它的實現原理,答案顯然是否定的。我看了MSDN上的文章,唯一的可行方案就是利用前文提到的用工廠的方法。要注意的是:這種方法是一種利用WellKnown模式來模擬Activated模式,是一種方法的折中。

前文說過,服務器端遠程對象,提供兩個接口。一個接口是具體要傳遞的遠程對象的接口,一個就是工廠接口。還必須有個工廠類實現工廠接口,提供創建遠程對象實例的方法。

public interface IServerObject
{
PersonGetPersonInfo(
string name, string sex, int age);
}


public interface IServerObjFactory
{
IServerObjectCreateInstance();
}


public class ServerObject:MarshalByRefObject,IServerObject
{
public PersonGetPersonInfo( string name, string sex, int age)
{
Personperson
= new Person();
person.Name
= name;
person.Sex
= sex;
person.Age
= age;
return person;
}

}


public class ServerObjFactory:MarshalByRefObject,IServerObjFactory
{
public IServerObjectCreateInstance()
{
return new ServerObject();
}

}

而客戶端呢,只提供接口就可以了。

public interface IServerObject
{
PersonGetPersonInfo(
string name, string sex, int age);
}


public interface IServerObjFactory
{
IServerObjectCreateInstance();
}

然后我們用WellKnown激活模式,在服務器端:

// 傳遞對象;
RemotingConfiguration.RegisterWellKnownServiceType(
typeof (ServerRemoteObject.ServerObjFactory),
" ServiceMessage " ,WellKnownObjectMode.SingleCall);

注意這里注冊的不是ServerObject類對象,而是ServerObjFactory類對象。

客戶端:

ServerRemoteObject.IServerObjFactoryserverFactory = (ServerRemoteObject.IServerObjFactory)
Activator.GetObject(
typeof (ServerRemoteObject.IServerObjFactory),
" tcp://localhost:8080/ServiceMessage " );

ServerRemoteObject.IServerObjectserverObj
= serverFactory.CreateInstance();

首先用GetObject()返回工廠接口,再利用該接口對象調用工廠的方法CreateInstance()來創建IServerObject對象。

也許有人會納悶了,這里使用的是WellKnown模式啊,為什么說是Activated模式呢?是這樣的,本質來說,它是WellKnown模式。但由于我們利用了工廠來創建實例,因此感覺上是在客戶端來創建具體的遠程對象實例。因此,我說這是一種方法的折中。

好了,寫到這里,自認為交待清楚了。但Remoting的實現遠不止于此,還有很多高級復雜的東西我們還沒有用到。例如自定義通道,自定義MarshalByReferenceObject派生類,生命周期管理,自定義代理。這些東西我也弄不清楚。如果以后弄明白了,希望能寫點東西。

關于Remoting(續)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品呦女| 九九在线精品视频 | 国产欧美视频一区二区三区 | 一区二区三区在线 | 网站 | 激情五月婷婷综合网 | 精品亚洲一区二区三区四区五区 | 国产在线观看91一区二区三区 | 亚瑟天堂久久一区二区影院 | 996热在线视频 | 欧美人xx| 久久久精品视频免费观看 | 五月婷婷啪 | 国内自拍视频在线观看 | 狠狠色欧美亚洲狠狠色五 | 欧美精品一区二区三区在线 | 国产精品久久久久久久久久久新郎 | v视界成人影院在线视频 | 成人小片magnet | 欧美6一10sex性hd | 欧美日韩一二三区 | 日本黄色高清网站 | 人人干视频在线观看 | 日本一区二区三区四区高清视频 | 人人干人人干人人干 | 欧美日韩一区二区三在线 | 欧美午夜免费观看福利片 | 久久夜夜操 | 2021年无线乱码播放高清完整 | 日本黄色网址视频 | 久久精品2| 日本黄页网站免费 | 国产亚洲综合成人91精品 | 精品一区二区三区在线观看视频 | 天堂资源在线观看 | 奇米影视亚洲精品一区 | 素人视频免费观看 | 狠狠的撸2015最新版狠狠的撸2015最新版 | 二区三区视频 | 欧美精品在线免费观看 | 第一页在线视频 | 91精品国产91久久久久久 |