[英].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.