问题描述
大家好,我想请教一个问题,我写了一个Remoting服务程序,服务我采用ClassFactory模式来生成远程对象(便于服务扩展),现在我遇到的问题是,代码在本地调试和局域网内调试都是正常的,但是把服务程序放在一台公网的服务器上面,就发生了问题,客户端可以成功获取远程类工厂接口对象,通过接口方法也可以获取远程的接口对象,但是在执行这个接口方法的时候就出错了,错误是一个socket错误:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。代码如下:类工厂接口:publicinterfaceIFactory{IAuthenticateGetAuthenticate();}远程对象接口:publicinterfaceIAuthenticate{byte[]authOperator(stringargOperatorName,stringargPassword,refstringerrmsg);byte[]authUser(stringargUserName,stringargPassword,refstringerrmsg);}类工厂实现:publicclassFactory:MarshalByRefObject,IFactory{publicFactory(){}publicIAuthenticateGetAuthenticate(){IAuthenticateresult=newAuthenticate();returnresult;}}远程类实现:publicclassAuthenticate:MarshalByRefObject,IAuthenticate{publicAuthenticate(){////TODO:在此处添加构造函数逻辑//}publicbyte[]authOperator(stringargOperatorName,stringargPassword,refstringerrmsg){byte[]result=null;/**业务代码*/returnresult;}publicbyte[]authUser(stringargUserName,stringargPassword,refstringerrmsg){byte[]result=null;/**业务代码*/returnresult;}}发布我使用配置文件的方式代码:stringconfigfilename="remoteconsole.exe.config";RemotingConfiguration.Configure(configfilename);配置文件如下:<?xmlversion="1.0"encoding="utf-8"?><configuration><system.runtime.remoting><application><channels><channelref="tcp"port="8085"/></channels><service><wellknownmode="Singleton"type="Factory.Factory,Factory"objectUri="Factory"/></service></application></system.runtime.remoting></configuration>客户端调用代码:RemoteInterFace.IFactoryobj=(RemoteInterFace.IFactory)Activator.GetObject(typeof(RemoteInterFace.IFactory),string.Format("tcp://{0}:{1}/Factory",this.cbServer.Text.Trim(),nPort));RemoteInterFace.IAuthenticateia=Common.RemoteFactory.GetAuthenticate();byte[]token=ia.authUser(this.tbUserName.Text.Trim(),this.tbPassword.Text.Trim(),referrmsg);//执行这个方法出错。ia对象我单步调试看了一下信息,远程随即生成Url也是有的。不知道是什么原因,请大家帮忙看一下。
解决方案
解决方案二:
SFUP楼主
解决方案三:
楼主还是到http://www.leadnt.org问去吧.
解决方案四:
继续等待,顶
解决方案五:
是不是服务器没有配好?开了服务没?用tcp你得考虑防火墙
解决方案六:
希望是服务器配置的问题,但是为什么获取Factory对象是可以,而且也是执行Factory的方法,说明8085端口没有问题
解决方案七:
自己顶一下
解决方案八:
怎么没有人帮我解答?
解决方案九:
ia=obj.GetAuthenticate();RemoteInterFace.IAuthenticateia=Common.RemoteFactory.GetAuthenticate();不知道你这句是什么意思,为什么有了obj而不用?
解决方案十:
publicIAuthenticateGetAuthenticate(){IAuthenticateresult=newAuthenticate();returnresult;}可能有问题,感觉newAuthenticate()不妥建议:factory的构造函数加一IAuthenticate类型参数得到远程对象后ia=obj.GetAuthenticate();传到工厂中
解决方案十一:
引用4楼ojekleen的回复:
用tcp你得考虑防火墙
这句话有道理如果是外网的话,还是socket或者webservices吧感觉remoting在内网用比较好
解决方案十二:
我也碰到这个问题,如果楼主解决了,请上来说一下。下面是我的问题:http://topic.csdn.net/u/20080703/17/904cd11b-6a60-467e-80ff-542e20341e79.html
解决方案十三:
我也碰到这个问题,如果楼主解决了,请上来说一下。下面是我的问题:http://topic.csdn.net/u/20080703/17/904cd11b-6a60-467e-80ff-542e20341e79.html
解决方案十四:
代码有点乱。。。用格式把代码再发一下。这样才有人帮你看。
解决方案十五:
是否部署在多个IP的机器上,CAO生成的对象可能绑在内网的那个IP地址。