.net Remoting(3)——激活,激活方式
在生成遠程對象時,創(chuàng)建和初始化新對象就是激活。遠程處理系統(tǒng)須始終了解所需的激活類型才能將對象設(shè)置為可供客戶端使用。激活有兩種方式:服務(wù)器激活和客戶端激活
?
服務(wù)器激活
服務(wù)器激活的對象是生存期直接受服務(wù)器直接控制的對象。僅當客戶端對對象進行方法調(diào)用時,服務(wù)器應(yīng)用程序域才會創(chuàng)建這些對象,而不是當客戶端調(diào)用new或Activator.GetObject的時候。客戶端請求服務(wù)器激活類型的實例時,會在客戶端應(yīng)用程序域中創(chuàng)建一個代理。服務(wù)器激活類型只允許使用默認構(gòu)造器。如果想使用特定的采用參數(shù)的構(gòu)造器創(chuàng)建實例的類型,可以使用客戶端激活,也可以動態(tài)發(fā)布特定實例。
?
服務(wù)器激活的對象有兩種激活模式:Singleton和SingleCall,這兩種模式又叫已知對象,由枚舉類型:WellKnownObjectMode來標識。
Singleton類型在任一時刻只有一個實例。所有的客戶端請求都將由這個實例提供服務(wù)。如果不存在實例,則服務(wù)器創(chuàng)建一個,且所有的后來的客戶端請求都將由這個實例提供服務(wù)。對于單件類型,會關(guān)聯(lián)到默認的生存期。
SingleCall類型針對每個客戶端請求創(chuàng)建一個實例。下一個方法調(diào)用將由其他服務(wù)器實例提供服務(wù),即使在系統(tǒng)尚未回收前一個實例的引用的情況下也是這樣。
?
類RemotingConfiguration
方法 RegisterWellKnownServiceType 將服務(wù)器上的對象類型注冊為已知類型
public static void RegisterWellKnownServiceType(
??? Type type,
??? string objectUri,
??? WellKnownObjectMode mode)
?
所有知道已注冊已知對象的URI的客戶都可以獲取該對象的代理,方法是:用ChannelServices注冊信道,然后調(diào)用new或Activator.GetObject方法來激活對象。
·當用new來激活對象時,須先要使用RegisterWellKnownClientType方法在客戶端注冊該已知對象類型。調(diào)用RegisterWellKonwnClientType方法向遠程處理基礎(chǔ)結(jié)構(gòu)提供遠程對象的位置,使new關(guān)鍵字可以創(chuàng)建它。
·當用Activator.GetObject方法來激活已知對象時,須將對象的URL作為參數(shù)提供給該方法,所以在這種情況下,不用預(yù)先在客戶端注冊。
當調(diào)用到達服務(wù)器后,系統(tǒng)從消息中提取URI,檢查遠程處理表以定位與該URI匹配的對象的引用,然后實例化該對象,將方法調(diào)用轉(zhuǎn)發(fā)給該對象。如果是SingleCall,則在方法調(diào)用完成后,該對象被銷毀。為每個方法創(chuàng)建對象的一個新實例。
Activator.GetObject與new的區(qū)別是:Activator.GetObject可以指定URL作為參數(shù),new的時候是從配置中獲取URL
(1)通過Actovator.GetObject方法來獲取代理
Activator類位于System下。它包含一些方法,用于在本地或從遠程創(chuàng)建對象類型,或獲取對現(xiàn)有遠程對象的引用。其中GetObject這個方法有2個重載,方法的意義是:為已知對象或 XML Web services 創(chuàng)建一個代理。
GetObject(Type, String)? 為指定類型和 URL 所指示的已知對象創(chuàng)建一個代理。
GetObject(Type, String, Object)? 為指定類型、URL 和通道數(shù)據(jù)所指示的已知對象創(chuàng)建一個代理。
?
以第一個2個參數(shù)的方法為例子:第一個參數(shù)Type,是在服務(wù)端注冊為已知類型的類型,第二個參數(shù)是已知對象的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來創(chuàng)建代理
當用new來激活對象時,先要使用RegisterWellKnownClientType方法在客戶端注冊該已知對象類型。然后使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)用方法時,服務(wù)端會管理已知類型對象的創(chuàng)建工作,這種生成對象是按默認的構(gòu)造器(無參)來進行。
?
客戶端激活
客戶端激活的對象由調(diào)用應(yīng)用程序域控制其生存期的對象,這種情況與應(yīng)用程序域控制本地對象生存期一樣。
創(chuàng)建客戶端激活對象時,客戶端將調(diào)用服務(wù)器。服務(wù)器實例化遠程對象,并將對象引用返回給客戶端。客戶端使用這個引用創(chuàng)建遠程對象的代理。每當客戶端創(chuàng)建客戶端激活對象的實例時,都會收到與遠程對象的特定服務(wù)器實例進行通信的代理,直至其租約過期,內(nèi)存被回收為止。
采用客戶端激活方式的步驟:
·要在服務(wù)器上創(chuàng)建客戶端激活的對象的實例,要知道它的Type
·使用RegisterActivatedServiceType方法在服務(wù)端注冊它。
客戶端步驟:
·客戶端先向ChannelServices注冊一個通道,
·通過調(diào)用new或Activator.CreateInstance激活對象。
?
創(chuàng)建客戶端激活類型實例的兩種方式:
·以new來進行
·以Activator.CreateInstance的調(diào)用中傳遞遠程對象
?
先準備服務(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方法來注冊類型,且先要設(shè)定ApplicationName,這個就相當于URL
?
客戶端
(1)以new來進行
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來激活客戶端對象類型,先使用RegisterActivatedClientType方法在客戶端注冊該對象類型,然后new就可以了。
(2)Activator.CreateInstance
如果用CreateInstance,則要提供遠程應(yīng)用程序的URL作為參數(shù),不用在客戶端注冊類型。如果要用到URL做參數(shù),則URL要封裝在UrlAttribute類實例中。
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)造器來創(chuàng)建遠程對象實例。
修改遠程對象,添加一屬性一個帶參構(gòu)造器:
public int Unid { get; set; }
?
public selfRemoteObject() { }
public selfRemoteObject(int iUnid)
{
??? Unid = iUnid;
}
?
添加了帶參構(gòu)造器,要顯示聲明默認的無參構(gòu)造器。
通過new方法來創(chuàng)建對象實例。
selfRemoteObject app1 = new selfRemoteObject();
Assert.AreEqual(0, app1.Unid);
?
selfRemoteObject app2 = new selfRemoteObject(10);
Assert.AreEqual(10, app2.Unid);
?
?
激活方式,是遠程對象實例創(chuàng)建的的管理方式。服務(wù)器端激活就是由服務(wù)端來管理遠程對象的創(chuàng)建,在這種方式下,當客戶端調(diào)用方法時,才創(chuàng)建實例;客戶端激活由客戶端來管理遠程對象的創(chuàng)建,在這種方式下,當客戶端發(fā)出調(diào)用就創(chuàng)建實例。
?
RemotingConfiguration類的類型注冊方法:
RegisterActivatedClientType 將客戶端上的對象 Type 注冊為可在服務(wù)器上激活的類型。
RegisterActivatedServiceType? 將服務(wù)端上的對象 Type 注冊為可根據(jù)請求從客戶端激活的類型。
RegisterWellKnownClientType? 將客戶端上的對象 Type 注冊為已知類型(“單個調(diào)用”(singlecall) 或 singleton)。
RegisterWellKnownServiceType? 將服務(wù)端上的對象 Type 注冊為已知類型(“單個調(diào)用”(singlecall) 或 singleton)。
?
斷開
RemotingServices.Disconnect這個方法用于阻止對象通過注冊的遠程處理信道再接收消息。它的參數(shù)須是實例化的對象(要關(guān)閉的),服務(wù)端注冊類型要通過Marshal方法來進行:
?
HttpChannel _channel = new HttpChannel(10001);
ChannelServices.RegisterChannel(_channel,false);
?
Console.WriteLine("http 通道remoting服務(wù)開始……");
selfRemoteObject obj=new selfRemoteObject();
?
RemotingServices.Marshal(obj, "selfRemoteObject");
?
斷開時,通過Disconnect方法:
RemotingServices.Disconnect(obj);
轉(zhuǎn)載于:https://www.cnblogs.com/jams742003/archive/2010/03/22/1691406.html
總結(jié)
以上是生活随笔為你收集整理的.net Remoting(3)——激活,激活方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TP-Link TL-WR980N 无线
- 下一篇: 怎么修改注册表