none
关于remoting一个想不出解释的问题 RRS feed

  • 问题

  • 这两天弄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.RemotingException
      Message="基础连接已关闭: 不是服务器上出现了致命错误,就是客户端验证失败"
      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:行号 82
      InnerException: 

    • 已编辑 启天 2010年5月8日 14:01
    2010年5月8日 13:32

答案

全部回复