none
.net remoting数据传输 RRS feed

  • 问题

  • .net remoting在传送数据时,可不可对对期进行压缩,以减少传输时所用的时间。
    在哪儿里实现?

    如果是WebService呢?在哪儿里实现?
    2009年11月23日 6:49

答案

  • Hi,
      .Net Remoting技术,我们可以将其看作是一种分布式处理方式。作为应用程序之间通信的一种机制,.Net Remoting与MSMQ消息队列不同,它不支持离线脱机消息,另外只适合.Net平台间程序的通信.从微软的产品角度来看,可以说Remoting就是分布式组件DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。.NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。
    你有兴趣可以看看我写的:
    WCF分布式开发必备知识(2):.Net Remoting

    WebService适用的领域和.Net Remoting不同。因为它使用http协议传输,base64编码。
    WCF分布式开发必备知识(4):Web Service

    关于Web Service优化传输,WSE里使用MTOM机制来实现。
    WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载

    当然这些特性WCF里都有支持。
    你可以看看WCF的编码器和WCF的流处理的文章。

    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    • 已标记为答案 YiChun Chen 2009年11月24日 8:58
    • 取消答案标记 male110 2009年11月25日 0:51
    • 已建议为答案 YiChun Chen 2009年11月25日 8:36
    • 已标记为答案 male110 2009年11月26日 2:36
    2009年11月24日 6:35
    版主
  • hi,当Remoting调用中通信对象inherit MarshalByRefObject时,信道间传输的IMessage对象的Properties,需要压缩这些信息的话,请重写RealProxy的Invoke方法。相应的另一端的IMessageSink就要负责理解这个压缩的信息。
    如果通信对象是MarshalByValue的话,就更简单,用ISerializeble接口代理Serilize Attribute,在Serialize和Deserialize方法中做手脚就可以了
    • 已标记为答案 male110 2009年11月26日 0:46
    2009年11月25日 12:16
  •       在remoting中,大对象大都是Marshal by reference的,在方法调用时并不序列化对象本身,而小对象虽然是序列化本身,速度却是很快。所以我想,你想用压缩的方法来提高remoting的通信效率,有时可能会起到相反的作用。

    • 已标记为答案 male110 2009年11月26日 0:46
    2009年11月25日 12:32

全部回复

  • 你好!
         底层使用的都是HTTP TCP/IP等协议,需要在传输前,自己压缩数据!
         使用GZipStream类来压缩!
    周雪峰
    2009年11月23日 9:21
    版主
  • 我是想问,在哪压?在哪儿解压?
    是不是有什么接口什么的?
    2009年11月23日 9:26
  • 请问你具体要传递什么?
    周雪峰
    2009年11月23日 9:30
    版主
  • 我是想,.Net remoting在通信时,不是可以是二进制的吗?
    我是想在数据,即将传送,但未传送时,对其进行压缩。

    客户端,在收到数据包后,解压。

    就是想在某一个阶段,或者说某一个层,对其进行统一控制,可以实现吗?
    2009年11月23日 9:35
  • .NET Remoting一般用于传递远程对象,你想压缩对象?
    周雪峰
    2009年11月23日 9:57
    版主
  • 更确切的说,是想压缩传输时的字节。
    2009年11月24日 0:41
  • remoting最终是Http或TCP传送的。
    是不是可以在某个地方拦截,对要传送的字节进行压缩。

    在接收时,同样,先对收到的字节进行解压
    2009年11月24日 0:45
  • 你好!
         你要传递数据直接用TcpListener和TcpClient类就可以了!在传递前使用GZipStream类来压缩byte数组!
          remoting主要用于创建远程对象,和你的需求不相符啊!
    周雪峰
    • 已建议为答案 YiChun Chen 2009年11月25日 8:36
    2009年11月24日 1:36
    版主
  • 我就是想在Remoting时,可不可以在传送前,对其压缩。
    2009年11月24日 1:42
  • Hi,
      .Net Remoting技术,我们可以将其看作是一种分布式处理方式。作为应用程序之间通信的一种机制,.Net Remoting与MSMQ消息队列不同,它不支持离线脱机消息,另外只适合.Net平台间程序的通信.从微软的产品角度来看,可以说Remoting就是分布式组件DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。.NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。
    你有兴趣可以看看我写的:
    WCF分布式开发必备知识(2):.Net Remoting

    WebService适用的领域和.Net Remoting不同。因为它使用http协议传输,base64编码。
    WCF分布式开发必备知识(4):Web Service

    关于Web Service优化传输,WSE里使用MTOM机制来实现。
    WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载

    当然这些特性WCF里都有支持。
    你可以看看WCF的编码器和WCF的流处理的文章。

    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    • 已标记为答案 YiChun Chen 2009年11月24日 8:58
    • 取消答案标记 male110 2009年11月25日 0:51
    • 已建议为答案 YiChun Chen 2009年11月25日 8:36
    • 已标记为答案 male110 2009年11月26日 2:36
    2009年11月24日 6:35
    版主
  • 你好!

    我觉得Frank版主的建议不错啊,WCF的确是支持这些特性的,而且是.NET 3.0开始出现的新的特性,你可以稍作研究,看是否能完成你的需求。另外,周版主也说了,Remoting主要用于创建远程对象,对于你的需求可能不太相符。

    你的问题到底是在哪里呢?


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年11月25日 8:35
  • 不是的。
    我想提高Remoting的效率。

    于是我想如果在传送之前,能对要传送的东西进行压缩,是不是大的节约了带宽?
    所以问问,这种想法是否可以实现?是否现实?

    我目前主要是在framework 2.0下面的。
    2009年11月25日 8:41
  • 我不是很熟悉这方面的技术啦,你看看这个能不能给你点帮助呢?
    http://mag.shudoo.com/qk/97264X/200904/29950875.html

    (本回复中包含了第三方网站,微软无法控制和测试此类网站或者该网站提供的软件,因此,微软无法保证此类网站的质量和安全性。微软提醒您在下载软件或者打开网站之前确定您了解了该网站的安全性。)


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年11月25日 8:54
  • hi,当Remoting调用中通信对象inherit MarshalByRefObject时,信道间传输的IMessage对象的Properties,需要压缩这些信息的话,请重写RealProxy的Invoke方法。相应的另一端的IMessageSink就要负责理解这个压缩的信息。
    如果通信对象是MarshalByValue的话,就更简单,用ISerializeble接口代理Serilize Attribute,在Serialize和Deserialize方法中做手脚就可以了
    • 已标记为答案 male110 2009年11月26日 0:46
    2009年11月25日 12:16
  •       在remoting中,大对象大都是Marshal by reference的,在方法调用时并不序列化对象本身,而小对象虽然是序列化本身,速度却是很快。所以我想,你想用压缩的方法来提高remoting的通信效率,有时可能会起到相反的作用。

    • 已标记为答案 male110 2009年11月26日 0:46
    2009年11月25日 12:32
  • 不知道你有没有类似的例子呢?
    供参考一下。
    2009年11月26日 0:46
  • 起到相反的作用,那就算了。
    2009年11月26日 0:48
  • 你好,
          例子我没有写过,所以究竟压缩remoting传输的binary数据是否能提高通信速度,我也只是猜测。如果在Remoting模式下对传输的数据进行预处理的话,其复杂度可能要大于采用socket方式。
          好吧,我只能说下我对remoting数据传输那里的理解,希望对你有些帮助。
          remoting服务端和客户端有一队对应的MessageSink负责收发数据,不同的Channel,对应着不同的MessageSink。就Tcp来说,这两个MessageSink是BinaryClientFormatterSink和binaryServerFormatterSink。楼猪所说的remoting传输压缩的二进制数据,就是要用自己的方法来取代它们的SyncProcessMessage和ProcessMessage,在里面实现自己的serailize和deserialize.
          然后我们有了自己的BinaryClientFormatterSink和binaryServerFormatterSink,但是怎么在代码中使用?对应BinaryClientFormatterSink和binaryServerFormatterSink有BinaryClientFormatterSinkProvider和binaryServerFormatterSinkProvider,没办法,这两个Provider就又需要重写了。可不是override,可怜这四个对于remoting传输二进制数据控制最关键的类,它们的关键方法都不是virtual的。
         ok.有了自己的provider,在register channel时把它们注册进去吧。
         在remoting client,我们已习惯了framework帮助我们自动挑选端口,在需要信道时,framework也会帮我们自动创建。想继续利用framework帮我们做注册信道和选择端口的话,就需要自己实现代理类。定义自己的代理类inherit from realProxy, 在初始化时,用自己的sink providr来创建sink吧。在Invoke IMessage时,选择使用自己创建的sink来SyncProcessmessage.
        

    2009年11月26日 4:04