Search code examples
.netxsddatacontractrestriction

Enforcing Restritions On DataContracts


Is there any way one can enforce restrictions on values passed in the form of data contracts as parameters to a given WCF Service?

For instance, please consider the contrived and certainly non-compilable example of this Vehicle class:

[DataContract]
public class Vehicle
{
    [DataMember]
    [Restriction(MinValue = 1, MaxValue = 30)] // Certainly not allowed... or is it?
    public int NumberOfWheels { get; set; }
}

Since, of course, nobody expects to find a vehicle with more than, say, 30 wheels, I would like to limit the range of the NumberOfWheels to a value between 1 and 30. Is there any way one can use XSD restrictions/facets to limit the range of acceptable values in this case?

(Please note that I could, of course, change the type of the NumberOfWheels from int to, say, byte to further limit the range of possible values. However, that wouldn't solve the problem... Of course, no one expects a vehicle to have 255 wheels.)


Solution

  • Here is an example using dataannotations:

    using System.ComponentModel.DataAnnotations;
    
    [DataContract]
    public class Test
    {
        [DataMember]
        [Range(1, 30)]
        public int MyProperty { get; set; }
    }
    
    public void DoWork(Test t)
    {            
        // this will throw validation exceptions, overloads are available to trap and handle
        Validator.ValidateObject(t, new ValidationContext(t), true);
        //do stuff here
    }
    

    Again it should be noted that behavior cannot be sent/forced to the client using this method. It will only validate that the object fulfills as described validation.