zoukankan      html  css  js  c++  java
  • .Net Remoting Exception: BinaryFormatter Version Incompatibility

    .Net Remoting Exception: BinaryFormatter Version Incompatibility

     

     

    在开发.Net Remoting的程序时,发现了如下异常消息:

    Exception Message:

    An unhandled exception of type 'System.Runtime.Serialization. SerializationException' occurred in mscorlib.dll

    Additional information: BinaryFormatter Version incompatibility. Expected Version 1.0. Received Version 1008738336.1684104552.

    注:由IIS承载Remote Objects,并且采用BinaryFormatterHTTPChannel

     

    然后在Ingo Rammerweb site-.Net Remoting FAQ发现了对上述异常信息的分析及其解决办法,详见下面的Reference 1

     

    *** Cause ***

    其实这和Version Incompatibility完全没有关系,事实上是由于Client端的Binary Formatter总是尽量以二进制编码的格式去解析从Server端获取的返回值造成的。

     

    假设ServerRemote Objects出现异常,返回如下异常信息:

    HTTP/1.1 500 Internal Server Error

    ……

    事实上,Client端却以二进制编码的格式来解析,它首先检查header头,寻找Server端使用的Serializer版本号,结果没有接受到版本号,而是读取"<htm...",并解析为"1008738336.1684104552"。然后比较1.01008738336.1684104552,并认为发生Version Incompatibility异常。

     

    *** Solution ***

    没有通用的解决办法,一般而言这是ServerRemote ObjectsRemote method发生异常。不过,可以按照如下的思路进行分析:

     

    1,确保Remote Objects部署正常

    可以通过如何检测Remote Objects是否部署成功来进行验证。

     

    2,使用Simon Fell提供tcpTrace工具来捕获ClientServer间传输的数据

    1)先从http://www.pocketsoap.com 下载tcpTrace工具。

    2)然后,需要将ClientServer端的BinaryFormatter改为SOAPFormatter,否则tcpTrance也只是简单捕获Header信息,没有SOAP消息体的信息。

    3)启动tcpTrace,并配置参数:

    • Listen on Port #: 81
    • Destination Server: localhost
    • Destination Port #: 80

        假设Remote Serverlocalhost,并且port80,然后Listen on Port设置为:81(当然可以为其他)。

        下一步需要调整ClientConfiguration file或者Source code,连接的Server URL设置为81(而不是80)。

    4)通过分析tcpSoapSOAP消息,查看Server真正返回的异常信息,找到真正的错误。

     

    上述技术仅对SAOwellknown)对象有用。对CAO对象而言,由Server端产生URL并包含真正的Port号。

    解决问题后,最后别忘了恢复ClientPort

     

    References:

    1, Ingo Rammer, .Net Remoting FAQ, http://www.thinktecture.com/Resources/RemotingFAQ/BINARYVERSIONMISMATCH.html

     

  • 相关阅读:
    网络杂项
    虚拟化
    虚拟化
    ssh
    开机启动命令/服务
    选择表达式
    查询一个表中的重复数据
    oracle逗号分隔函数
    只能为浮点数或整数的正则表达式
    后台模拟弹出上传匡
  • 原文地址:https://www.cnblogs.com/rickie/p/57537.html
Copyright © 2011-2022 走看看