我有一些通过 WCF 服务进行通信的客户端和服务器。我需要在它们之间创建“代理”来过滤响应。我成功创建了小型 .NET 8.0 应用程序,该应用程序接受来自客户端的 TCP 套接字并将所有数据转发到服务器。但来自服务器的响应根本没有任何意义。这是示例响应
有什么想法可以将其转换为实际对象吗?我知道课堂应该是什么样子。它只是一个 bool 和两个 ArrayList/object[] 字段。
我创建了一个小型控制台实用程序,它使用 DataContractSerializer 和 XmlDictionaryWriter.CreateBinaryWriter 进行二进制序列化。但结果很接近,但不一样。
我也尝试朝这个方向前进http://blog.functionfun.net/2009/11/fiddler-plug-in-for-inspecting-wcf.html。但我有 xml 格式不正确的异常
WCF 还包括一个配套序列化器 NetDataContractSerializer。 NetDataContractSerializer:
- 不安全。有关更多信息,请参阅 BinaryFormatter 安全指南。
- 与 BinaryFormatter 和 SoapFormatter 序列化程序类似,因为它也发出 .NET Framework 类型名称作为序列化数据的一部分。
- 当序列化和反序列化结束时共享相同类型时使用。
BinaryFormatter 已被弃用。出于充分的理由。
我的理解是 BinaryFormatter 本质上是转储对象的内存表示形式,仅进行一些小的修复来调整地址、类型等。这种方法相当脆弱,而且非常不安全。但可能有很多细节我不知道。据我所知,确切的格式没有记录。
您要么需要让代理不知道包内容,要么切换到现代 .net 支持的序列化协议。您也许可以使用 EnableUnsafeBinaryFormatterSerialization 来启用支持,但这不是我推荐的。越早迁移到受支持的解决方案,长期遇到的问题就越少。
我不得不朝另一个方向走。我找到了带有合同的 .dll 并创建了小型控制台应用程序,在其中添加了与服务器 web.config 中相同的端点,并且还为该 .dll 中的每个服务合同实现了包装器。它现在可以工作了,但我必须做更多无用的工作来设置所有东西。
btw 数据采用 Latin1 编码,但无论如何,当我尝试使用 BinaryFormatter/BinaryWritter 序列化对象时,它不是格式。我的猜测是,由于 Castle.Core 动态类构建内容与 ServiceModel WCF 内容的工作方式,数据变得如此混乱。