Remoting :关于广域网事件回调失败与值传递


Remoting广域网事件回调

本来在本机和局域内已经测试好了,可把服务品在一放到外网,事件回调就不行了...
郁闷了半天终于知道回调的地址是按局域网(192.168.*.*)回的,本以为把回调的通道改了,端口做映射,可还是缺了一个端口.....

  private static void SetChannelUris(ChannelDataStore channelData)
  {
   string[] IpAndPort = {confer + localIPAddress + localPort};
   channelData.ChannelUris = IpAndPort;
  }

除了通过路由器,把局域网内的客户端暴露出去或做一个VPN,其他办法都不行...


在知秋一叶的博客里提到双向通道...可不知客户端IP,端口,不知咋再开一条通道连回来,郁闷了,网络知识不行撒...

http://blog.joycode.com/qqchen/archive/2003/09/17/399.joy
http://blog.csdn.net/yj39867/archive/2004/08/03/60214.aspx
http://blog.csdn.net/yj39867/archive/2004/08/03/60157.aspx
这是一个反过来的例子,服务器在网内,客户端在公网...
http://blog.csdn.net/yj39867/archive/2004/08/03/60117.aspx

可他给的链接现在却怎么也打不开了...而且一个还是收费的,感觉本来挺简单的东西搞得这么复杂没这么个必要....

其实都是因为remoting本身就是短连接,长连接对他来说要维护的东西太多了,这个基于SOCKET做TCP的就知道了,起码心跳包那些都一定是要的....

得出个结论,并不是Remoting不支持广域网,是其在局域网用起来才好用....

按值传送与按引用传送
按值传送
由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。

对象仅在创建对象的应用程序域中有效。除非对象是从 MarshalByRefObject 派生得到或标记为 Serializable,否则,任何将对象作为参数传递或将其作为结果返回的尝试都将失败。如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。

按引用传送
如果对象是从 MarshalByRefObject 派生得到,则从一个应用程序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从 MarshalByRefObject 派生得到的对象标记为 Serializable。远程使用此对象时,负责进行序列化并已预先配置为 SurrogateSelector 的格式化程序将控制序列化过程,并用一个代理替换所有从 MarshalByRefObject 派生得到的对象。如果没有预先配置为 SurrogateSelector,序列化体系结构将遵从下面的标准序列化规则











posted @ 2009-08-10 15:19  yellowyu  阅读(762)  评论(0编辑  收藏  举报