DataMember属性用于数据验证

8

我想在我的WCF数据合同成员上放置属性来验证字符串长度,并可能使用正则表达式进行更细粒度的参数验证。

对于数字和DateTime值,我可以使用[Range]属性,想知道你们是否发现了其他可用于数据验证的WCF数据成员属性。我已经发现了许多适用于Silverlight的属性,但对于WCF却没有找到。


可能是重复的问题:http://stackoverflow.com/questions/10835455/how-should-i-validate-parameters-passed-into-my-wcf-service/10839767#10839767 - ErnieL
3个回答

22

在你的项目中添加 System.ComponentModel.DataAnnotations 引用。

该引用提供了以下数据注释:

RequiredAttribute, RangeAttribute, StringLengthAttribute, RegularExpressionAttribute

你可以在你的数据契约中像下面这样使用。

    [DataMember]
    [StringLength(100, MinimumLength= 10, ErrorMessage="String length should be between 10 and 100." )]
    [StringLength(50)]     // Another way... String max length 50
    public string FirstName { get; set; }

    [DataMember]
    [Range(2, 100)]
    public int Age { get; set; }

    [DataMember]
    [Required]
    [RegularExpression(@"\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b", ErrorMessage = "Invalid Mail id")]
    public string Email { get; set; }
希望这可以帮到你。

14
很好,但是我该如何让我的 Web 服务强制执行这些限制呢?当我调试并传入错误的数据(或缺少数据)时,它仍然不会抛出任何错误。 - MikeTeeVee
2
@MikeTeeVee 你可以使用IParameterInspector来完成。请参考http://www.devtrends.co.uk/blog/validating-wcf-service-operations-using-system.componentmodel.dataannotations - Prasad Kanaparthi

2

手动验证数值:您可以使用Validator类手动应用验证测试。您可以在属性的set访问器上调用ValidateProperty方法,以检查该值是否符合属性的验证属性。当数据绑定以接收来自验证属性的验证异常时,您还必须将ValidatesOnExceptions和NotifyOnValidationError属性都设置为true。

var unsafeContact = Request["contactJSON"];
try
{
    var serializer = new DataContractJsonSerializer(typeof(Contact));
    var stream = new MemoryStream(Encoding.UTF8.GetBytes(unsafeContact));
    Contact = serializer.ReadObject(stream) as Contact;
    stream.Close();
}
catch (Exception)
{
   // invalid contact
}

联系人类:

[DataContract]
public sealed class Contact
{
    /// <summary>
    /// Contact Full Name
    /// </summary>
    /// <example>John Doe</example>
    [DataMember(Name = "name", IsRequired = true)]
    [StringLength(100, MinimumLength = 1, ErrorMessage = @"Name length should be between 1 and 100.")]
    public string Name {
        get
        {
            return HttpUtility.HtmlEncode(_name);
        }
        internal set
        {
            Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Name" });
            _name = value;
        }
    }
    private string _name;

    // ...
}

1

我在WCF中添加了 DevTrends.WCFDataAnnotations ,并且能够在客户端通过 DataAnnotations 验证错误。但是,每当有验证错误时,客户端会抛出异常。我想停止这个过程。我希望有一些“HasError”为真,并且没有异常。如何做到这一点。谢谢。 - KumarHarsh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接