积极答复者
关于remoting一个想不出解释的问题

问题
-
这两天弄remoting弄出一个很奇怪的问题,虽然知道怎么解决,可实在想不出为什么...问题跟我之前问的一样,remoting会抛出 基础连接已关闭...
用于注册远程对象的dll代码:
public class Class1:MarshalByRefObject { public DataTable aaa() { var tbl = new DataTable("dsfd"); for (int j = 0; j < 20; j++) { tbl.Columns.Add("Col_" + j, typeof(decimal)); } for (int j = 0; j < 100; j++) //这里插入100行数据,如果只插入2行都正常,好像8行以上就会出错 { var r = tbl.NewRow(); foreach (DataColumn column in tbl.Columns) { r[column] = j; } tbl.Rows.Add(r); } var ret = new DataSet("ddd"); ret.Tables.Add(tbl); return tbl; } }
服务器端代码:
var bin = new BinaryServerFormatterSinkProvider(); var cbin = new BinaryClientFormatterSinkProvider(); bin.TypeFilterLevel = TypeFilterLevel.Full; var param = new Hashtable(); param["name"] = "kugar1"; param["port"] = 19860; param["secure"] = false; param["socketCacheTimeout"] = 30; var tcpserver = new TcpChannel(param,cbin,bin);
tcpserver.StartListening(null);
ChannelServices.RegisterChannel(tcpserver, false); //注册信道 RemotingConfiguration.ApplicationName = "kugar"; RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off; RemotingConfiguration.CustomErrorsEnabled(false); RemotingConfiguration.RegisterActivatedServiceType(typeof(Class1));
客户端代码:
var tempaddr = "tcp://localhost:19860"; //用这句语句 localhost 地址连接就报错 //var tempaddr = "tcp://127.0.0.1:19860"; //用这句127.0.0.1也出错 //var tempaddr = "tcp://192.168.18.249:19860"; //用本机的ip地址连接就正常.. ; object[] attrs1 = { new UrlAttribute(tempaddr + "/kugar") }; try { var handle = Activator.CreateInstance("ClassLibrary1", "ClassLibrary1.Class1", attrs1); if (handle == null) { return null; } var temp = (Class1)handle.Unwrap(); var qq = temp.aaa(); //这个语句返回100行的datatable对象,如果是使用localhost做地址就提示那个错误,但是如果用192.168.18.249这个ip地址就正常 return temp; } catch (Exception ex) { throw; }
大家看看我在客户端 var qq = temp.aaa(); 这行的注释....
很奇怪的现象,用localhost跟127.0.0.1的时候,执行时会抛出错误,但是用本机的IP地址192.168.18.249执行的时候,却是正常的
而且这种情况只出现在当返回大量数据的时候,比如说返回100行的datatable对象,但当我只返回只有5行数据的datatable对象时,调用却正常..
还有,就是当我服务器端注册信道的时候,不使用TCPChannel类型,而是使用TCPServerChannel类型时,返回也是正常的,我看msdn好像说tcpchannel是server+client的方便类么,,,,怎么在这点上有差别呢???
抛出的错误信息如下:
捕捉到 System.Runtime.Remoting.RemotingExceptionMessage="基础连接已关闭: 不是服务器上出现了致命错误,就是客户端验证失败"Source="mscorlib"StackTrace:Server stack trace:在 System.Runtime.Remoting.Channels.SocketHandler.ReadFromSocket(Byte[] buffer, Int32 offset, Int32 count)在 System.Runtime.Remoting.Channels.SocketHandler.Read(Byte[] buffer, Int32 offset, Int32 count)在 System.Runtime.Remoting.Channels.Tcp.TcpFixedLengthReadingStream.Read(Byte[] buffer, Int32 offset, Int32 count)在 System.IO.BinaryReader.ReadString()在 System.Runtime.Serialization.Formatters.Binary.BinaryObjectString.Read(__BinaryParser input)在 System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectString(BinaryHeaderEnum binaryHeaderEnum)在 System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)在 System.Runtime.Remoting.Channels.CoreChannel.DeserializeBinaryResponseMessage(Stream inputStream, IMethodCallMessage reqMsg, Boolean bStrictBinding)在 System.Runtime.Remoting.Channels.BinaryClientFormatterSink.DeserializeMessage(IMethodCallMessage mcm, ITransportHeaders headers, Stream stream)在 System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)Exception rethrown at [0]:在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)在 ClassLibrary1.Class1.aaa()在 client.frmclient.GetDataControl() 位置 E:\remotetest 解决数据量大无法访问\remotetest\client\frmclient.cs:行号 82InnerException:
- 已编辑 启天 2010年5月8日 14:01
答案
-
你好 你參考下我這篇文章 http://hi.baidu.com/1987raymond/blog/item/0aa6e83f96e215ca7d1e71c9.html 或許會對你有一定的幫助
I see you~http://hi.baidu.com/1987raymondMy Blog~~~- 已建议为答案 Jing0Moderator 2010年5月17日 2:47
- 已标记为答案 Jing0Moderator 2010年5月18日 15:13
全部回复
-
你好 你參考下我這篇文章 http://hi.baidu.com/1987raymond/blog/item/0aa6e83f96e215ca7d1e71c9.html 或許會對你有一定的幫助
I see you~http://hi.baidu.com/1987raymondMy Blog~~~- 已建议为答案 Jing0Moderator 2010年5月17日 2:47
- 已标记为答案 Jing0Moderator 2010年5月18日 15:13