remoting+多个远程服务对象+并存与协作

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

...全文
230 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
spunder 2006-12-04
  • 打赏
  • 举报
回复
边看边学
soldier_shen 2006-12-03
  • 打赏
  • 举报
回复
真的很高兴还有这么多的朋友关心这个问题,感谢hdt给出的配置文件代码,

咱们还可以进一步探索这个问题的!
早起晚睡 2006-11-09
  • 打赏
  • 举报
回复
俞庆平 2006-11-09
  • 打赏
  • 举报
回复
此贴虽然是问题贴,并且没有人解决,但要去精华,此问题我也遇到过。
并且也是雷同方法解决。
真相重于对错 2006-11-09
  • 打赏
  • 举报
回复
用配置文件比较好,便于移植
类似
<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>
peilianhai 2006-11-09
  • 打赏
  • 举报
回复
好,祝贺
我再学习中
股神 2006-10-28
  • 打赏
  • 举报
回复
up
soldier_shen 2006-10-28
  • 打赏
  • 举报
回复
就此结贴!
soldier_shen 2006-10-28
  • 打赏
  • 举报
回复
没想到在这里描述我的困惑,也是对我的思想的一种解放!!

似乎在问别人的同时,也在默默地问自己!!

其实,自己才是最了解自己的程序的人!!

真的很抱歉,我的问题被我的第二个疑问解决了(2、是否可以改用:用一个通道,注册多个远程服务对象的方式?)。

真的让我很开心,用一个通道,一个端口,往上面注册两个服务对象,就解决问题了。

再次,感谢CSDN!!!!!

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧