传递复杂类型的WCF问题

问题描述:

我有一个服务契约,它定义了一个类型为System.Object(xs:anyType in the WSDL)的参数的方法。我希望能够在此参数中传递简单类型以及复杂类型。简单类型工作正常,但是当我尝试传递在我的WSDL中定义的复杂类型时,出现此错误:传递复杂类型的WCF问题

元素'http://tempuri.org/:value'包含'http://schemas.datacontract.org/2004/07/MyNamespace:MyClass'数据契约的数据。反序列化器不知道映射到此合约的任何类型。将与'MyClass'相对应的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将其添加到传递给DataContractSerializer的已知类型列表中。

将它作为已知类型添加并不会有帮助,因为它已经在我的WSDL中。我如何通过“xs:anyType”参数传递一个复杂类型的对象?

更多信息:

我相信这一点使用NetDataContract时的作品,但因为我的客户是Silverlight的,我不能使用。

我已经看到了引用显式扩展xs:anyType的复杂类型,但我不知道如何让WCF生成这样做的WSDL,我不知道它是否会帮助。

感谢

我已经通过使用ServiceKnownType属性解决了此问题。我只是将我的复杂类型添加为我的服务合同中已知类型的服务,并且错误消失。我不知道为什么这是上次我尝试它不起作用。

它似乎没有以任何方式影响WSDL,所以我怀疑序列化的流必须有一些区别,告诉反序列化器该对象可以使用我的类型进行反序列化。

的NetDataContract工作,因为NetDataContractSerializer包含类型信息。

KnownType属性指示DataContractSerializer如何反序列化消息。作为具体实现,这是超出公共合约定义的信息,不属于WSDL。

因为反序列化器需要识别适当的类型并创建一个实例,所以您永远无法传递任何旧数据类型。

您可能能够在运行时导出已知类型,而不是在DataContract中对它们进行硬编码。看样品here

尝试使用数据契约代理映射不支持的对象,即dot net特定或不可互操作的类型。请参阅MSDN

我尝试添加ServiceKnownType属性,指定我想要传递的类型,但仍然收到相同的错误。 我也尝试将KnownType属性添加到我的数据契约(这看起来很愚蠢,因为它与数据契约是同一类型)。我想如果在编译时添加它们并没有帮助,那么在运行时添加它们将无济于事。

如果我扩展了另一个复杂类型,在我看来,我想将KnownType属性添加到该基类型。但是因为我的基类型是Object,所以我没有办法做到这一点。

至于替代品,在我看来,这些用于包装没有定义合同的类型。但在我的情况下,我确定了合同。

我希望这会有所帮助。我看到我的一个同事使用这个代码发送复杂的数据类型,而且对我来说这很简单。这与basicHttpBinding一起使用,并且与MOSS BDC以及使用基本绑定的其他应用程序一起工作得非常好。

  1. 创建基于通用类
  2. 使用数据合同数据合同时的信息需要被发送

    [DataContract(命名空间= “http://Service.DataContracts”,名称= “ServiceDataContractBase”)] 公共类ServiceDataContract {

    public ServiceDataContract() { } 
    
    public ServiceDataContract(TValueType Value) 
    { 
        this.m_objValue = Value; 
    } 
    
    private TValueType m_objValue; 
    
    [DataMember(IsRequired = true, Name = "Value", Order = 1)] 
    public TValueType Value 
    { 
        get { return m_objValue; } 
        set { m_objValue = value; } 
    } 
    

    }

在WCF函数中需要使用此数据协定的情况下,它将返回复杂的数据类型。例如:

public ServiceDataContract<string[]> GetStrings() 
{ 
    string[] temp = new string[10]; 
    return new ServiceDataContract<string[]>(temp); 
} 

更新:ServiceDataContract是泛型类正在使用TValueType。它并不是因为呈现HTML出现错误而出现的。

+0

感谢您的回复。然而,这个实现仍然需要在服务合同中指定类型(或者我错过了什么?)。我希望能够通过使用相同服务操作的非特定类型(可以是简单类型或我的数据协定类型之一)。 – dcstraw 2008-09-17 17:07:08

现在我已经通过创建一个新的数据合约类型来解决这个问题,该类型可以包装另一个数据合约类型或简单类型。而不是传递类型对象,现在我传递这个包装类。这工作正常,但我仍然想知道是否有原始问题的解决方案。