DataMember attributes for Data validation
Asked Answered
C

3

8

I am looking to place attributes on my WCF data contract members to validate string length and possibly use regex for more granular parameter validation.

I can the [Range] attribute for numeric and DateTime values and was wondering if any of you have found any other WCF Data Member attributes I can use for data validation. I have found a bevvy of attributes for Silverlight but not for WCF.

Crass answered 15/10, 2012 at 14:35 Comment(1)
Possible duplicate of: #10835955Cangue
R
22

Add System.ComponentModel.DataAnnotations reference to your project.

The reference provides some DataAnnotations which are:

RequiredAttribute, RangeAttribute, StringLengthAttribute, RegularExpressionAttribute

you can in your datacontract like below.

    [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; }

Hope this helps.

Rejoin answered 15/10, 2012 at 18:23 Comment(2)
This is nice, but how do I get my web service to enforce these restrictions? When I debug, and pass in bad data (or missing data) it still does not throw any errors.Saying
@Saying you can do it by using IParameterInspector. See this devtrends.co.uk/blog/…Rejoin
T
3

Manually Validating Values: You can manually apply the validation test by using the Validator class. You can call the ValidateProperty method on the set accessor of a property to check the value against the validation attributes for the property. You must also set both ValidatesOnExceptions and NotifyOnValidationError properties to true when data binding to receive validation exceptions from validation attributes.

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
}

Contact class:

[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;

    // ...
}
Transmute answered 13/3, 2014 at 0:8 Comment(0)
G
1

Try to look look for WCF Data Annotations. WCFDataAnnotations allows you to automatically validate WCF service operation arguments using System.ComponentModel.DataAnnotations attributes.

http://wcfdataannotations.codeplex.com/

Garcia answered 17/3, 2014 at 16:9 Comment(1)
I added DevTrends.WCFDataAnnotations in wcf,and DataAnnotations validation error is able to pass at client .But whenver there is validation error,exception is thrown at client end.I want to stop this.I want some "HasError" to be true and there is no exception.How to do this. ThanksTripletail

© 2022 - 2024 — McMap. All rights reserved.