读书人

请大家帮帮忙remoting 服务器半闭重

发布时间: 2012-01-18 00:23:26 作者: rapoo

请大家帮帮忙,remoting 服务器半闭重起后客户怎么办?重新注册时出错了。急急急急急急急急急!!!!!!!!!!!!!!!!!!!
服务器是Windows服务器,有N个客户端,互相定阅事件传递消息。

注册方法

C# code
    private void regRemoteService()        {            BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();            BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();            serverProvider.TypeFilterLevel = TypeFilterLevel.Full;            IDictionary props = new Hashtable();            TcpChannel tcpChannel = null;            try            {                props["name"] = "YuHaiYang";                props["bindTo"] = this.objDBAgentApplication.RemotingIp;                props["port"] = this.objDBAgentApplication.LocalHostPort;                props["rejectRemoteRequests"] = false;                tcpChannel = new TcpChannel(props, clientProvider, serverProvider);            }            catch            {                //重新连接时让系统自选端口                props["name"] = "YuHaiYang";                props["bindTo"] = this.objDBAgentApplication.RemotingIp;                props["port"] = 0;                props["rejectRemoteRequests"] = false;                tcpChannel = new TcpChannel(props, clientProvider, serverProvider);            }            ChannelServices.RegisterChannel(tcpChannel, false);            this.eventWrapper = new EventWrapper();            this.iGpsRemote = (IGpsRemote)Activator.GetObject(typeof(IGpsRemote), "tcp://" + this.objDBAgentApplication.RemotingIp + ":" + this.objDBAgentApplication.RemotingPort + "/GPSRemoteServer.soap");                               }    

当Windows服务重起后,客户端定阅的事件就不能再收到消息,重新注册服务器 再调用regRemoteService方法出错

private void regRemoteService()
{
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;

IDictionary props = new Hashtable();

TcpChannel tcpChannel = null;
try
{
props["name"] = "YuHaiYang";
props["bindTo"] = this.objDBAgentApplication.RemotingIp;
props["port"] = this.objDBAgentApplication.LocalHostPort;
props["rejectRemoteRequests"] = false;
tcpChannel = new TcpChannel(props, clientProvider, serverProvider);
}
catch
{
//重新连接时让系统自选端口
props["name"] = "YuHaiYang";
props["bindTo"] = this.objDBAgentApplication.RemotingIp;
props["port"] = 0;
props["rejectRemoteRequests"] = false;
tcpChannel = new TcpChannel(props, clientProvider, serverProvider);//这里报错
}
ChannelServices.RegisterChannel(tcpChannel, false);

this.eventWrapper = new EventWrapper();
this.iGpsRemote = (IGpsRemote)Activator.GetObject(typeof(IGpsRemote), "tcp://" + this.objDBAgentApplication.RemotingIp + ":" + this.objDBAgentApplication.RemotingPort + "/GPSRemoteServer.soap");

}
[/code]
出现异常:未处理的NotSupportedExcepaction 不支持所指定的方法。由于以前的函数求值超时,函数求值被禁用,必须继续执行才能启用函数求值





请问如何解决?

[解决办法]
关注~~~
没碰到过类似情况~
[解决办法]
只能帮顶啊
[解决办法]
你服务器段程序没有指定固定的端口?
[解决办法]
我不懂哦,是不是又是同步的问题呢...锁之类的....
[解决办法]
重启.就把注册页面关闭先吧,

这样客户就不会出错的.
[解决办法]
没处理过这个问题,帮你顶吧
[解决办法]
只做过服务器端通知客户端的,没有遇到过客户端还要相互通信的需求。
所以你的这个还真不知道怎么解决。
你的服务器正常的时候,客户端A调用客户端B的方法没有问题?

如果正常的话,怀疑是远程调用的问题。
你委托中注册的是远程方法,调用远程的对象和方法,两端的内存拷贝需要同步的。
服务器端关闭之后,其实客户端的两端的内存拷贝可能已经不同步或者不能通信了,因为你注册的时候已经重新自选端口了。

建议: 在客户端做心跳,检测服务器端是否关闭,如果关闭,在重新连接时客户端重新注册。
同时,在注册的时候,所有注册的委托需要再次重新注册。

以上都是我的分析,没有做过,如有不对,请见谅
[解决办法]
http://cardcaptorsakur.itpub.net/post/16292/103641

这篇文章讲的比较详细
[解决办法]
帮顶
[解决办法]
这个问题有点难度!!
帮你顶!!
[解决办法]
LZ太精益求精了
佩服!
[解决办法]
给给变通的做法。 服务重启之后,初始化的第一步,先把已经注册了的所有信道,全部注销

C# code
加上此段代码(该代码摘自Bruce Zhang) //获得当前已注册的通道;            IChannel[] channels = ChannelServices.RegisteredChannels;             //关闭指定名为MyTcp的通道;            foreach (IChannel eachChannel in channels)            {                if (eachChannel.ChannelName == "TcpChannel")                {                    TcpChannel tcpChannel = (TcpChannel)eachChannel;                     //关闭监听;                    tcpChannel.StopListening(null);                     //注销通道;                    ChannelServices.UnregisterChannel(tcpChannel);                }            }
[解决办法]
好像一直没有发现客户端去通知服务器段注销信道的说法。
其实想想也不可能,信道都不通了,它咋能通知到服务器端呢?

上面的代码直接拷贝的,没有仔细看,其实你如果是服务器段直接重启的话,
根本就不用判断信道名称,把所有已经注册的信道,全部注销吧,反正留着也没用。
[解决办法]
学习,up
[解决办法]
探讨
好像一直没有发现客户端去通知服务器段注销信道的说法。
其实想想也不可能,信道都不通了,它咋能通知到服务器端呢?

上面的代码直接拷贝的,没有仔细看,其实你如果是服务器段直接重启的话,
根本就不用判断信道名称,把所有已经注册的信道,全部注销吧,反正留着也没用。

[解决办法]
顶上去,mark
[解决办法]
只能关注+学习...
[解决办法]
很好的问题,学习帮顶
[解决办法]
机器重启后,所有程序状态自然全部取消,所以需要把消息序列化。

读书人网 >C#

热点推荐