传递复杂类型的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。
我尝试添加ServiceKnownType属性,指定我想要传递的类型,但仍然收到相同的错误。
我也尝试将KnownType属性添加到我的数据契约(这看起来很愚蠢,因为它与数据契约是同一类型)。我想如果在编译时添加它们并没有帮助,那么在运行时添加它们将无济于事。
如果我扩展了另一个复杂类型,在我看来,我想将KnownType属性添加到该基类型。但是因为我的基类型是Object,所以我没有办法做到这一点。
至于替代品,在我看来,这些用于包装没有定义合同的类型。但在我的情况下,我确定了合同。
我希望这会有所帮助。我看到我的一个同事使用这个代码发送复杂的数据类型,而且对我来说这很简单。这与basicHttpBinding一起使用,并且与MOSS BDC以及使用基本绑定的其他应用程序一起工作得非常好。
- 创建基于通用类
-
使用数据合同数据合同时的信息需要被发送
[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出现错误而出现的。
现在我已经通过创建一个新的数据合约类型来解决这个问题,该类型可以包装另一个数据合约类型或简单类型。而不是传递类型对象,现在我传递这个包装类。这工作正常,但我仍然想知道是否有原始问题的解决方案。
感谢您的回复。然而,这个实现仍然需要在服务合同中指定类型(或者我错过了什么?)。我希望能够通过使用相同服务操作的非特定类型(可以是简单类型或我的数据协定类型之一)。 – dcstraw 2008-09-17 17:07:08