我已经在服务器上设置了一个wcf服务,该服务器将数据提供给使用Flashbuilder4构建的flex项目。我使用webservice introspection功能来生成DTO和服务代理。其中一个DTO具有Object类型的属性。这个通用对象的内容会根据特定的条件而有所不同,但始终是另一个复杂的对象。创建并填充在FB4的VO顺利,但是当对象序列化,它看起来是这样的:用FlashBuilder4的通用数据类型向wcf服务发送请求
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<tns:GetC xmlns:tns="EP2ProblemDemo1">
<tns:anyObj>
<tns:Property1>yo!</tns:Property1>
<tns:Property2>yo! yo!</tns:Property2>
</tns:anyObj>
</tns:GetC>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
下,您可能注意到anyObj财产丢失任何种类的类型信息,尽管引用类型ClassB的的对象:
public class ClassA
{
public string Property1;
}
public class ClassB : ClassA
{
public string Property2;
}
的anyObj论据GETC缺少类似如下:
的xsi:type = “TNS:ClassB的” 的xmlns:TNS = “EP2ProblemDemo1”
当wcf服务尝试对消息进行解码时,又会产生错误。我认为该服务将anyObj的内容解释为不能隐式转换为基础对象的数组?
将anyObj参数(类型为Object)设置为ClassB的实例时,似乎类型信息丢失。这是正确的行为?我的印象是,尽管你可以设置一个超类变量来引用它的一个子类,但子类的类型信息应该被保留,因此也包含在该对象的序列化表示中。
编辑 这似乎是FlashBuilder4串行从Object类型的属性发送回WCF服务,则无法反序列化什么看起来像一个数组时剔除了具体类型和命名空间信息。另外,当在FB4中导入WSDL文件时,VO继承将会丢失,因为它们最终会扩展EventDispatcher以便进行绑定。
SOLUTION 我的解决方案是改变粘性和朝向与AMF远程处理移动,使用FluorineFX FluorineFX official website其中精美的作品,并且具有更低的带宽消耗的由于数据作为字节数组传递到愉快的副作用在.NET实现。
我相信WebORB WebORB official site也可以用来在.net中实现AMF,但我还没有尝试过。
是啊!我错过了这个问题演示,但不幸的是没有关闭实际的项目。 – 2011-03-08 01:13:22