[英].NET Remoting and Server Activated Objects
以下代碼有什么問題...我有這個Complex類:
public class Complex : MarshalByRefObject
{
public double imaginary{get;set;}
public double real{get;set;}
public void setReal(double re)
{
real = re;
}
public void setImaginary(double im)
{
imaginary = im;
}
public Complex(double im, double re)
{
imaginary = im;
real = re;
}
public void writeMembers()
{
Console.WriteLine(real.ToString() + imaginary.ToString());
}
}
實際上,它還有更多功能,但是代碼太大了,在此情況下,我們不會使用其余的代碼。
然后,我實現了一個監聽連接的服務器:
HttpChannel channel = new HttpChannel(12345);
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(SharedLib.Complex), "ComplexURI", WellKnownObjectMode.SingleCall);
Console.WriteLine("Server started. Press any key to close...");
Console.ReadKey();
foreach (IChannel ichannel in ChannelServices.RegisteredChannels)
{
(ichannel as HttpChannel).StopListening(null);
ChannelServices.UnregisterChannel(ichannel);
}
然后,我們有客戶:
try
{
HttpChannel channel = new HttpChannel();
RemotingConfiguration.Configure("Client.exe.config", false);
Complex c1 = (Complex)Activator.GetObject(typeof(Complex), "http://localhost:12345/ComplexURI");
if (RemotingServices.IsTransparentProxy(c1))
{
c1.real = 4;
c1.imaginary = 5;
c1.writeMembers();
Console.ReadLine();
}
else
{
Console.WriteLine("The proxy is not transparent");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}
然后,我運行服務器,這將打開一個控制台窗口,然后運行客戶端。 我只得到00,而不是在服務器窗口上顯示4和5,這表明成員沒有更改。 我該怎么做,所以成員會改變嗎? 謝謝。
問題是您正在使用WellKnownObjectMode.SingleCall
。 如文檔所述 :
- SingleCall每個傳入消息都由一個新的對象實例提供服務。
- 單例每個傳入消息均由同一對象實例提供服務。
另請參見RegisterWellKnownServiceType的文檔:
當調用到達服務器時,.NET Framework從消息中提取URI,檢查遠程處理表以找到與URI相匹配的對象的引用,然后在必要時實例化該對象,將方法調用轉發給該對象。 如果對象注冊為SingleCall,則在方法調用完成后將銷毀該對象。 將為每個調用的方法創建一個對象的新實例。
在您的情況下,語句c.Real = 4
是對Real
屬性設置器的調用。 它調用遠程對象,該對象創建一個新對象,將Real
屬性設置為4,然后返回。 然后,當您設置imaginary
屬性時,它將創建一個新對象,依此類推。
如果您希望此方法有效,則必須使用WellKnownObjectMode.Singleton
。 但是您可能想問自己,是否真的想要這樣的“聊天”界面。 每次設置屬性時,都需要通過代理調用服務器。
最后,您可以考慮完全放棄遠程處理。 它是舊技術,並且有許多缺點。 如果這是新開發的,則應該使用Windows Communications Foundation (WCF)。 遠程處理文檔說:
本主題特定於保留的舊技術,以與現有應用程序向后兼容,不建議用於新開發。 現在應該使用Windows Communication Foundation(WCF)開發分布式應用程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.