日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

.net Remoting(3)——激活,激活方式

發(fā)布時(shí)間:2023/12/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .net Remoting(3)——激活,激活方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在生成遠(yuǎn)程對(duì)象時(shí),創(chuàng)建和初始化新對(duì)象就是激活。遠(yuǎn)程處理系統(tǒng)須始終了解所需的激活類型才能將對(duì)象設(shè)置為可供客戶端使用。激活有兩種方式:服務(wù)器激活和客戶端激活

?

服務(wù)器激活

服務(wù)器激活的對(duì)象是生存期直接受服務(wù)器直接控制的對(duì)象。僅當(dāng)客戶端對(duì)對(duì)象進(jìn)行方法調(diào)用時(shí),服務(wù)器應(yīng)用程序域才會(huì)創(chuàng)建這些對(duì)象,而不是當(dāng)客戶端調(diào)用newActivator.GetObject的時(shí)候。客戶端請(qǐng)求服務(wù)器激活類型的實(shí)例時(shí),會(huì)在客戶端應(yīng)用程序域中創(chuàng)建一個(gè)代理。服務(wù)器激活類型只允許使用默認(rèn)構(gòu)造器。如果想使用特定的采用參數(shù)的構(gòu)造器創(chuàng)建實(shí)例的類型,可以使用客戶端激活,也可以動(dòng)態(tài)發(fā)布特定實(shí)例。

?

服務(wù)器激活的對(duì)象有兩種激活模式:SingletonSingleCall,這兩種模式又叫已知對(duì)象,由枚舉類型:WellKnownObjectMode來(lái)標(biāo)識(shí)。

Singleton類型在任一時(shí)刻只有一個(gè)實(shí)例。所有的客戶端請(qǐng)求都將由這個(gè)實(shí)例提供服務(wù)。如果不存在實(shí)例,則服務(wù)器創(chuàng)建一個(gè),且所有的后來(lái)的客戶端請(qǐng)求都將由這個(gè)實(shí)例提供服務(wù)。對(duì)于單件類型,會(huì)關(guān)聯(lián)到默認(rèn)的生存期。

SingleCall類型針對(duì)每個(gè)客戶端請(qǐng)求創(chuàng)建一個(gè)實(shí)例。下一個(gè)方法調(diào)用將由其他服務(wù)器實(shí)例提供服務(wù),即使在系統(tǒng)尚未回收前一個(gè)實(shí)例的引用的情況下也是這樣。

?

RemotingConfiguration

方法 RegisterWellKnownServiceType 將服務(wù)器上的對(duì)象類型注冊(cè)為已知類型

public static void RegisterWellKnownServiceType(

??? Type type,

??? string objectUri,

??? WellKnownObjectMode mode)

?

所有知道已注冊(cè)已知對(duì)象的URI的客戶都可以獲取該對(duì)象的代理,方法是:用ChannelServices注冊(cè)信道,然后調(diào)用newActivator.GetObject方法來(lái)激活對(duì)象。

·當(dāng)用new來(lái)激活對(duì)象時(shí),須先要使用RegisterWellKnownClientType方法在客戶端注冊(cè)該已知對(duì)象類型。調(diào)用RegisterWellKonwnClientType方法向遠(yuǎn)程處理基礎(chǔ)結(jié)構(gòu)提供遠(yuǎn)程對(duì)象的位置,使new關(guān)鍵字可以創(chuàng)建它。

·當(dāng)用Activator.GetObject方法來(lái)激活已知對(duì)象時(shí),須將對(duì)象的URL作為參數(shù)提供給該方法,所以在這種情況下,不用預(yù)先在客戶端注冊(cè)。

當(dāng)調(diào)用到達(dá)服務(wù)器后,系統(tǒng)從消息中提取URI,檢查遠(yuǎn)程處理表以定位與該URI匹配的對(duì)象的引用,然后實(shí)例化該對(duì)象,將方法調(diào)用轉(zhuǎn)發(fā)給該對(duì)象。如果是SingleCall,則在方法調(diào)用完成后,該對(duì)象被銷毀。為每個(gè)方法創(chuàng)建對(duì)象的一個(gè)新實(shí)例。

Activator.GetObjectnew的區(qū)別是:Activator.GetObject可以指定URL作為參數(shù),new的時(shí)候是從配置中獲取URL

1)通過Actovator.GetObject方法來(lái)獲取代理

Activator類位于System下。它包含一些方法,用于在本地或從遠(yuǎn)程創(chuàng)建對(duì)象類型,或獲取對(duì)現(xiàn)有遠(yuǎn)程對(duì)象的引用。其中GetObject這個(gè)方法有2個(gè)重載,方法的意義是:為已知對(duì)象或 XML Web services 創(chuàng)建一個(gè)代理。

GetObject(Type, String)? 為指定類型和 URL 所指示的已知對(duì)象創(chuàng)建一個(gè)代理。

GetObject(Type, String, Object)? 為指定類型、URL 和通道數(shù)據(jù)所指示的已知對(duì)象創(chuàng)建一個(gè)代理。

?

以第一個(gè)2個(gè)參數(shù)的方法為例子:第一個(gè)參數(shù)Type,是在服務(wù)端注冊(cè)為已知類型的類型,第二個(gè)參數(shù)是已知對(duì)象的URL

服務(wù)端:

HttpChannel _channel = new HttpChannel(10001);

ChannelServices.RegisterChannel(_channel,false);

?

Console.WriteLine("http 通道remoting服務(wù)開始……");

RemotingConfiguration.RegisterWellKnownServiceType(

typeof(selfRemoteObject), "selfRemoteObject",

WellKnownObjectMode.Singleton);

?

客戶端:

public void TestService()

{

selfRemoteObject app =

(selfRemoteObject)Activator.GetObject(

typeof(selfRemoteObject),

"http://localhost:10001/selfRemoteObject");

?Assert.AreEqual(13,app.Plus(3, 10));

}

2)通過new來(lái)創(chuàng)建代理

當(dāng)用new來(lái)激活對(duì)象時(shí),先要使用RegisterWellKnownClientType方法在客戶端注冊(cè)該已知對(duì)象類型。然后使new關(guān)鍵字可以創(chuàng)建它。

服務(wù)端還是(1)中的服務(wù)端

客戶端:

public void TestServiceNew()

{

RemotingConfiguration.RegisterWellKnownClientType(

typeof(selfRemoteObject),

"http://localhost:10001/selfRemoteObject");

??? selfRemoteObject app = new selfRemoteObject();

?

??? Assert.AreEqual(13, app.Plus(3, 10));

}

?

以上兩種方法在創(chuàng)建代理后,調(diào)用方法時(shí),服務(wù)端會(huì)管理已知類型對(duì)象的創(chuàng)建工作,這種生成對(duì)象是按默認(rèn)的構(gòu)造器(無(wú)參)來(lái)進(jìn)行。

?

客戶端激活

客戶端激活的對(duì)象由調(diào)用應(yīng)用程序域控制其生存期的對(duì)象,這種情況與應(yīng)用程序域控制本地對(duì)象生存期一樣。

創(chuàng)建客戶端激活對(duì)象時(shí),客戶端將調(diào)用服務(wù)器。服務(wù)器實(shí)例化遠(yuǎn)程對(duì)象,并將對(duì)象引用返回給客戶端。客戶端使用這個(gè)引用創(chuàng)建遠(yuǎn)程對(duì)象的代理。每當(dāng)客戶端創(chuàng)建客戶端激活對(duì)象的實(shí)例時(shí),都會(huì)收到與遠(yuǎn)程對(duì)象的特定服務(wù)器實(shí)例進(jìn)行通信的代理,直至其租約過期,內(nèi)存被回收為止。

采用客戶端激活方式的步驟:

·要在服務(wù)器上創(chuàng)建客戶端激活的對(duì)象的實(shí)例,要知道它的Type

·使用RegisterActivatedServiceType方法在服務(wù)端注冊(cè)它。

客戶端步驟:

·客戶端先向ChannelServices注冊(cè)一個(gè)通道,

·通過調(diào)用newActivator.CreateInstance激活對(duì)象。

?

創(chuàng)建客戶端激活類型實(shí)例的兩種方式:

·new來(lái)進(jìn)行

·Activator.CreateInstance的調(diào)用中傳遞遠(yuǎn)程對(duì)象

?

先準(zhǔn)備服務(wù)端:

HttpChannel _channel = new HttpChannel(10001);

ChannelServices.RegisterChannel(_channel,false);

?

Console.WriteLine("http 通道remoting服務(wù)開始……");

RemotingConfiguration.ApplicationName = "selfRemoteObject";

RemotingConfiguration.RegisterActivatedServiceType

(typeof(selfRemoteObject));

Console.Read();

服務(wù)端要通過RegisterActivatedServiceType方法來(lái)注冊(cè)類型,且先要設(shè)定ApplicationName,這個(gè)就相當(dāng)于URL

?

客戶端

1)以new來(lái)進(jìn)行

public void TestClientNew()

{

??? HttpChannel _channel = new HttpChannel();

??? ChannelServices.RegisterChannel(_channel, false);

?

RemotingConfiguration.RegisterActivatedClientType

(

typeof(selfRemoteObject),

"http://localhost:10001/selfRemoteObject");

?

??? selfRemoteObject app1 = new selfRemoteObject();

??? Assert.AreEqual(10, app1.Plus(1, 9));

}

通過new來(lái)激活客戶端對(duì)象類型,先使用RegisterActivatedClientType方法在客戶端注冊(cè)該對(duì)象類型,然后new就可以了。

2Activator.CreateInstance

如果用CreateInstance,則要提供遠(yuǎn)程應(yīng)用程序的URL作為參數(shù),不用在客戶端注冊(cè)類型。如果要用到URL做參數(shù),則URL要封裝在UrlAttribute類實(shí)例中。

public void TestClientInstance()

{

??? HttpChannel _channel = new HttpChannel();

??? ChannelServices.RegisterChannel(_channel,false);

?

?

object[] url={new UrlAttribute

("http://localhost:10001/selfRemoteObject")};

selfRemoteObject app1 =

?(selfRemoteObject)Activator

.CreateInstance(typeof(selfRemoteObject), null, url);

?

??? Assert.AreEqual(10, app1.Plus(1, 9));

}

?

客戶端激活方式可以使用帶參構(gòu)造器來(lái)創(chuàng)建遠(yuǎn)程對(duì)象實(shí)例。

修改遠(yuǎn)程對(duì)象,添加一屬性一個(gè)帶參構(gòu)造器:

public int Unid { get; set; }

?

public selfRemoteObject() { }

public selfRemoteObject(int iUnid)

{

??? Unid = iUnid;

}

?

添加了帶參構(gòu)造器,要顯示聲明默認(rèn)的無(wú)參構(gòu)造器。

通過new方法來(lái)創(chuàng)建對(duì)象實(shí)例。

selfRemoteObject app1 = new selfRemoteObject();

Assert.AreEqual(0, app1.Unid);

?

selfRemoteObject app2 = new selfRemoteObject(10);

Assert.AreEqual(10, app2.Unid);

?

?

激活方式,是遠(yuǎn)程對(duì)象實(shí)例創(chuàng)建的的管理方式。服務(wù)器端激活就是由服務(wù)端來(lái)管理遠(yuǎn)程對(duì)象的創(chuàng)建,在這種方式下,當(dāng)客戶端調(diào)用方法時(shí),才創(chuàng)建實(shí)例;客戶端激活由客戶端來(lái)管理遠(yuǎn)程對(duì)象的創(chuàng)建,在這種方式下,當(dāng)客戶端發(fā)出調(diào)用就創(chuàng)建實(shí)例。

?

RemotingConfiguration類的類型注冊(cè)方法:

RegisterActivatedClientType 將客戶端上的對(duì)象 Type 注冊(cè)為可在服務(wù)器上激活的類型。

RegisterActivatedServiceType? 將服務(wù)端上的對(duì)象 Type 注冊(cè)為可根據(jù)請(qǐng)求從客戶端激活的類型。

RegisterWellKnownClientType? 將客戶端上的對(duì)象 Type 注冊(cè)為已知類型(單個(gè)調(diào)用”(singlecall) singleton)。

RegisterWellKnownServiceType? 將服務(wù)端上的對(duì)象 Type 注冊(cè)為已知類型(單個(gè)調(diào)用”(singlecall) singleton)。

?

斷開

RemotingServices.Disconnect這個(gè)方法用于阻止對(duì)象通過注冊(cè)的遠(yuǎn)程處理信道再接收消息。它的參數(shù)須是實(shí)例化的對(duì)象(要關(guān)閉的),服務(wù)端注冊(cè)類型要通過Marshal方法來(lái)進(jìn)行:

?

HttpChannel _channel = new HttpChannel(10001);

ChannelServices.RegisterChannel(_channel,false);

?

Console.WriteLine("http 通道remoting服務(wù)開始……");

selfRemoteObject obj=new selfRemoteObject();

?

RemotingServices.Marshal(obj, "selfRemoteObject");

?

斷開時(shí),通過Disconnect方法:

RemotingServices.Disconnect(obj);

轉(zhuǎn)載于:https://www.cnblogs.com/jams742003/archive/2010/03/22/1691406.html

總結(jié)

以上是生活随笔為你收集整理的.net Remoting(3)——激活,激活方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。