在我的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、用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、是否可以改用:用一个通道,注册多个远程服务对象的方式?
类似
<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>