2011-03-02 45 views
1

我已经在服务器上设置了一个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,但我还没有尝试过。

回答

0

您不能使用“任何”对象。您必须始终明确描述哪些类型是允许的。检查KnownTypeAttributeServiceKnownTypeAttributeDataContractResolver(我还没有太多的经验)。如果您确实需要发送任意数据,而不能定义所有可能的对象,则使用XElement。在xsd中,它将被描述为xsd:any。

+0

是啊!我错过了这个问题演示,但不幸的是没有关闭实际的项目。 – 2011-03-08 01:13:22

0
  1. 对于您在网络上发送的所有对象类型,您需要设置所谓的[DataContract]属性

    [DataContract] 公共类ClassA的 { 公共字符串Property1; }

  2. 代替使用基本类型(对象)应使用基类,并利用[KnownType]属性

    [的ServiceContract(命名空间= “EP2ProblemDemo1”)] 公共接口IService { [的OperationContract] ClassC GetC(ClassD classB); }

    [KnownType(typeof运算(ClassA的)),KnownType(typeof运算(ClassB的))] 公共类D类 {}

希望这有助于

+0

感谢您的快速回复!看起来我已经把一个相当糟糕的演示放在一起,因为这些点是有效的,并在实际项目中实施。 – 2011-03-08 01:15:43

相关问题