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

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

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

更多信息:

我相信这在使用 NetDataContract 时有效,但我无法使用它,因为我的客户端是 Silverlight。

我已经看到对显式扩展 xs:anyType 的复杂类型的引用,但我不知道如何使 WCF 生成执行此操作的 WSDL,而且我不知道它是否有帮助。

谢谢

有帮助吗?

解决方案 3

我已经通过使用 ServiceKnownType 属性解决了这个问题。我只需将复杂类型添加为服务合同中的服务已知类型,错误就会消失。我不确定为什么上次尝试时不起作用。

它似乎不会以任何方式影响 WSDL,因此我怀疑序列化流一定有一些差异,通知反序列化器可以使用我的类型反序列化对象。

其他提示

NetDataContract 之所以有效,是因为 NetDataContractSerializer 包含类型信息。

KnownType 属性指示 DataContractSerializer 如何反序列化消息。由于特定于实现,这是公共合同定义的信息之外的信息,不属于 WSDL。

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

您可以在运行时派生已知类型,而不是将它们硬编码在 DataContract 中。看一看 这里 样品。

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

  1. 基于泛型类创建数据契约
  2. 需要发送信息时使用数据合约

    [DataContract(命名空间 = "http://Service.DataContracts“,name =“ servicedatAcontractbase”)]公共类服务。

    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 渲染出现问题,它没有出现。

尝试使用数据契约代理来映射不受支持的特定于点网或不可互操作类型的对象。看 微软软件定义网络

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

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

如果我要扩展另一个复杂类型,在我看来,我想要将 KnownType 属性添加到该基本类型中。但由于我的基本类型是对象,我看不到任何方法可以做到这一点。

至于代理,在我看来,它们用于包装没有定义契约的类型。然而,就我而言,我确实定义了合同。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top