C# .NET远程处理和服务器激活的对象
以下代码有什么问题。。。 我有一门复杂的课:C# .NET远程处理和服务器激活的对象,c#,remoting,C#,Remoting,以下代码有什么问题。。。 我有一门复杂的课: public class Complex : MarshalByRefObject { public double imaginary{get;set;} public double real{get;set;} public void setReal(double re) { real = re; }
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();
}
}
然后,我运行服务器,打开一个控制台窗口,然后运行客户机。
我没有在服务器窗口上显示4和5,只得到了00,这表明成员没有改变。
我该怎么做,这样成员就改变了?
谢谢。问题是您使用的是
WellKnownObjectMode.SingleCall
。正如上面所说:
- SingleCall每个传入消息都由一个新的对象实例提供服务
- Singleton每个传入消息都由同一个对象实例提供服务
c.Real=4
是对Real
属性设置器的调用。它调用远程对象,远程对象创建一个新对象,将Real
属性设置为4,然后返回。然后,当您设置invential
属性时,它会创建一个新对象,等等
如果你想让它工作,你必须使用WellKnownObjectMode.Singleton
。但是你可能想问问自己,你是否真的想要这样一个“健谈”的界面。每次设置属性时,都需要通过代理调用服务器
,最后,您可以考虑完全放弃远程处理。这是一项古老的技术,有许多缺点。如果这是新的开发,您应该使用(WCF)。报告说:
本主题特定于保留以与现有应用程序向后兼容的遗留技术,不建议用于新开发。现在应该使用Windows通信基金会(WCF)开发分布式应用程序。