2009-05-04 50 views
6

我有一个在其中定义了[DataContract]类的WCF服务。每个属性都有[DataMember]属性,并且我向一些属性添加了一些Data Annotation属性[必需的]和[StringLength]。WCF服务合同上的数据注释

然后我在asp.net MVC应用程序中使用此服务作为服务引用。当我得到所有使用属性的列表时

var attr= from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>() 
         from attribute in prop.Attributes.OfType<ValidationAttribute>() 
         select attribute; 

我看不到任何数据注释已经通过。这是WCF的限制还是我在这里做了一些根本性的错误?

回答

7

当您通过电线发送数据合同时,属性将不会被序列化。您在本质元数据中创建的与属性相关的新属性,以及属性所属的类型。这不是数据,将不可用。

我想你已经在你的asp.net mvc应用程序中添加了一个服务引用,除非指定,否则将创建代表你的数据契约的新代理类。

添加服务引用时,如果单击高级按钮,请确保选中“使用现有类型”。这确保您的服务将使用您现有的conract。

这可能不是最佳实践,因为客户端应用程序必须知道您从服务返回的类型。这可能是好的,如果你的服务只有你自己使用,在这种情况下,你需要在你的asp.net mvc应用程序中添加对你的合约的引用。

+0

所以底线,有没有什么办法可以让IDE复制DataAnnotations属性给消费者代理类?如果是,如何?我没有找到您的文章中提到的'使用现有类型'选项(我使用VS10)。 – Shimmy 2011-02-13 08:20:33

3

OData团队正在解决方案中将验证元数据公开为“词汇表”。

的更多信息:http://www.odata.org/blog/vocabularies

+0

非常有趣。希望我们可以继续使用标准(便携式)数据注释和数据合约属性,并且框架将由我们为我们完成。相同类型的实体声明的属性已经太多了,例如,序列化程序,XML序列化程序,数据合同,数据注释,实体框架...... !!! – 2013-07-18 09:40:05