我创建了一个简单的 WCF 应用程序,它公开了一个操作。此操作将复合数据类型作为参数。
我没有用 [DataContract] 属性修饰这个复合数据类型。但这是有效的,我可以在 WSDL 中看到它的架构。
现在我的理解是,这个新的自定义类型应该用 [Serializable] 或 [dataContract] 属性修饰,以参与 Web 服务操作。
我在这里缺少什么?
我创建了一个简单的 WCF 应用程序,它公开了一个操作。此操作将复合数据类型作为参数。
我没有用 [DataContract] 属性修饰这个复合数据类型。但这是有效的,我可以在 WSDL 中看到它的架构。
现在我的理解是,这个新的自定义类型应该用 [Serializable] 或 [dataContract] 属性修饰,以参与 Web 服务操作。
我在这里缺少什么?
自 .NET 3.5 SP1 起,WCF 中引入了 POCO 支持,您不再需要[DataContract]
使用和[DataMember]
属性来装饰您的对象。公共属性将自动公开。尽管我建议您使用这些属性明确标记它们。
正如 Darin 所说,sp1 引入了对推断数据协定的支持。如果编组的类型是公共类型并且没有用DataContract
属性修饰,WCF 将自动推断出这样的属性并将该DataMemeber
属性应用于该类型的所有公共成员。
Juval Löwy 在他的《Programming WCF Services》一书中说:
在我看来,依赖推断的数据契约是一种草率的技巧,它违背了 WCF 中大多数其他事物的本质。...请务必使用 DataContract 属性,并明确说明您的数据合同。这将使您能够利用数据合同功能,例如版本控制。