在我的remoting应用中,服务器端需要注册两个远程服务对象,以向客户端提供多个服务。真的很抱歉,这几天活多,问题多,分不够啊,可是我的问题有有些难,还请各位见谅!!!我的做法如下:
    1、声明了两个通道
    2、用RemotingServices.Marshal()注册对象
一、用于消息处理的远程服务对象
    1、服务器端的通道注册、对象实例化、对象注册如下:
        BinaryServerFormatterSinkProvider serverProvider = new
             BinaryServerFormatterSinkProvider();
            BinaryClientFormatterSinkProvider clientProvider = new
             BinaryClientFormatterSinkProvider();
            //此语句即设置序列化安全级别的
            serverProvider.TypeFilterLevel = TypeFilterLevel.Full;
            //
            IDictionary props = new Hashtable(); 
            props["name"] = "msg_server";
            props["port"] = 9932;
            //
            HttpChannel channel = new HttpChannel(props, clientProvider, serverProvider);
            ChannelServices.RegisterChannel(channel, false);            //直接用marshal注册并实例化远程对象
            Obj = new class_remote_server_msg();
            ObjRef objRef = RemotingServices.Marshal(Obj, "remote_server_msg");
   2、其客户端的通道注册和远程对象获取语句如下:
       BinaryServerFormatterSinkProvider serverProvider = new
                BinaryServerFormatterSinkProvider();
            BinaryClientFormatterSinkProvider clientProvider = new
             BinaryClientFormatterSinkProvider();
            serverProvider.TypeFilterLevel = TypeFilterLevel.Full;            IDictionary props = new Hashtable();
            props["name"] = "msg_server";
            props["port"] = 0;
            HttpChannel channel = new HttpChannel(props, clientProvider, serverProvider);
            ChannelServices.RegisterChannel(channel, false);            try
            {
                static_remote_server.remote_server_msg = (class_remote_server_msg)Activator.GetObject(
                 typeof(class_remote_server_msg), "http://192.168.0.202:9932/remote_server_msg");
            }
            catch (Exception error)
            { MessageBox.Show(error.ToString()); }
////////////////////////////////////////////////////////////////////////////////////////
二、第二个远程服务对象是处理数据的,要连接Oracle数据库,但是它和上面的声明方式差不多。知识我用了不同的通道名和端口号,不同的uri
1、服务器端
IDictionary httpProp = new Hashtable();
            httpProp["name"] = "data_server";
            httpProp["port"] = 9931;
            IChannel channel2 = new HttpChannel(httpProp,
             new SoapClientFormatterSinkProvider(),
             new SoapServerFormatterSinkProvider());
            ChannelServices.RegisterChannel(channel2,false);
//实例化远程对象
             Obj_data = new class_remote_server_data();
             ObjRef remote_objRef = RemotingServices.Marshal(Obj_data, "remote_server_data");
2、客户端
IDictionary props = new Hashtable();
            props["name"] = "data_server";
            props["port"] = 0;
            IChannel channel2 = new HttpChannel(props,
             new SoapClientFormatterSinkProvider(),
             new SoapServerFormatterSinkProvider());
            ChannelServices.RegisterChannel(channel2, false);
   //设置服务器ip、端口和远程服务名
                remote_server_connect =
                   "http://" + "192.168.0.202:9931" + "/remote_server_data";                //用getObject获得远程数据库连接服务对象,在此处指明端口
                static_remote_server.remote_server_data=
                   (class_remote_server_data)Activator.GetObject
                   (typeof(class_remote_server_data),remote_server_connect);////////////////////////////////////////////////////////////////////////////////我已经成功测试的内容如下:
    这两个远程服务我是一个一个做的,都没问题,我把他们放到一个服务端软件里后,发现两个不能一起被客户端获得了,而我把它们中的一个注释掉后,运行又没问题,由于数据服务那个远程对象是要在登录验证时用,它是先在客户端用的,它没问题,后面的消息服务对象就无法获得。我的疑问: 
    1、我的这种多通道注册方式(服务器端的和客户端的)是否有问题?
不过记住:我用同样的注册方式,在客户端只获取一个远程对象的情况下,都没问题。    2、是否可以改用:用一个通道,注册多个远程服务对象的方式?
            

解决方案 »

  1.   

    没想到在这里描述我的困惑,也是对我的思想的一种解放!!似乎在问别人的同时,也在默默地问自己!!其实,自己才是最了解自己的程序的人!!真的很抱歉,我的问题被我的第二个疑问解决了(2、是否可以改用:用一个通道,注册多个远程服务对象的方式?)。真的让我很开心,用一个通道,一个端口,往上面注册两个服务对象,就解决问题了。再次,感谢CSDN!!!!!
      

  2.   

    用配置文件比较好,便于移植
    类似
    <configuration>
    <system.runtime.remoting>
    <application name="mailserver">
    <service>
    <wellknown mode="SingleCall" type="XXXX.object1,XXXX"
     objectUri="object1"/>
    <wellknown mode="SingleCall" type="XXXX.object2,XXXX"
    </service>
    <channels>
    <channel ref="tcp server" port="8080" />
    </channels>
    </application>
    </system.runtime.remoting>
    </configuration>
      

  3.   

    真的很高兴还有这么多的朋友关心这个问题,感谢hdt给出的配置文件代码,咱们还可以进一步探索这个问题的!