1

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

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

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

更多信息:

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

我已经看到对显式扩展 xs:anyType 的复杂类型的引用,但我不知道如何让 WCF 生成一个可以做到这一点的 WSDL,我也不知道它是否会有所帮助。

谢谢

4

6 回答 6

2

NetDataContract 有效,因为 NetDataContractSerializer 包含类型信息。

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

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

您可能能够在运行时派生已知类型,而不是将它们硬编码在 DataContract 中。在这里查看示例。

于 2008-09-16T07:30:34.150 回答
1

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

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

    [DataContract(Namespace = " http://Service.DataContracts ", Name = "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 的呈现有问题,它没有出现。

于 2008-09-17T08:59:39.577 回答
1

I have solved this problem by using the ServiceKnownType attribute. I simply add my complex type as a service known type on my service contract, and the error goes away. I'm not sure why this didn't work last time I tried it.

It doesn't appear to affect the WSDL in any way, so I suspect that the serialized stream must have some difference that informs the deserializer that the object can be deserialized using my type.

于 2008-12-15T23:58:03.793 回答
0

尝试使用数据协定代理来映射不受支持的对象,即点网特定或不可互操作的类型。见MSDN

于 2008-09-16T07:47:02.893 回答
0

我尝试添加 ServiceKnownType 属性,指定我尝试传递的类型,但我仍然得到相同的错误。我还尝试将 KnownType 属性添加到我的数据合同中(这似乎很愚蠢,因为它与数据合同的类型相同)。如果在编译时添加它们没有帮助,我猜想在运行时添加它们也无济于事。

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

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

于 2008-09-16T15:33:34.350 回答
0

For now I have worked around this by creating a new data contract type that can wrap either another data contract type or a simple type. Instead of passing type Object, now I pass this wrapper class. This works OK, but I'd still like to know if there is a solution to the original issue.

于 2008-09-17T17:11:28.083 回答