日期:2014-05-19  浏览次数:20836 次

Remoting给远程对象属性赋值.....望大家来帮个忙,严究两天未解

public   class   wr:MarshalByRefObject
{
public   ftpname;

public   wr()
{
ftpname= "aaa ";

}
public   string   addnew()
{
return   ftpname;
}
}
服务端:

                              TcpServerChannel   channel   =   new   TcpServerChannel(8086);
                                ChannelServices.RegisterChannel(channel,false);
                       
                    RemotingConfiguration.RegisterWellKnownServiceType(typeof(Hosts),   "hi ",   WellKnownObjectMode.SingleCall);
客户端:
                    wrwr=   (Hosts)Activator.GetObject(typeof(wr),   "tcp://127.0.0.1:8046/hi ");
                wr.ftpname   =   "22222 ";
Response.Write(wr.addnew());

使用这种方法却实可以调用远程对象,但是这种方法调用远程对象的时候就实例化构造函数.所以ftpname的值永远都是默认构造函数的aaa,没有办法在客户端给值.

在网上找了很久发现可以用客户端激活方式,但是总是出错不知道为什么

服务端:
                                TcpServerChannel   channel   =   new   TcpServerChannel(8086);
                                ChannelServices.RegisterChannel(channel,false);
                        //客户激活模式
                                RemotingConfiguration.ApplicationName   =   "hi ";
                                RemotingConfiguration.RegisterActivatedServiceType(typeof(wr));
客户端:
              RemotingConfiguration.RegisterActivatedClientType(typeof(wr),   "tcp://127.0.0.1:8086/hi ");
                wr   obj   =   new   wr();
wr.ftpname= "2222 ";
Response.Write(wr.addnew());

------解决方案--------------------
RemotingConfiguration.RegisterActivatedClientType(typeof(wr), "tcp://127.0.0.1:8086/hi ");这行代码只能被执行一次,你应该把它放在一个静态构函数里面。以保证它只被执行一次!
------解决方案--------------------
远程对象激活模式不对.
下面是我写的一个简单例子:
类:
[Serializable]
public class Calculator : MarshalByRefObject
{
public Calculator()
{

}

public int Sum(int x, int y)
{
return x + y;
}
}
服务器端:
class Server
{
static void Main(string[] args)
{
ChannelServices.RegisterChannel(new TcpChannel(4006), false);

RemotingConfiguration.RegisterWellKnownServiceType(typeof(Calculator)
, "Calculator.rem ", WellKnownObjectMode.Singleton); // 重点地方

Console.WriteLine( "运行中... ");
Console.