Part #1 of the article can be read here
If we have a DataContract
Product.cs
[DataContract] public class Product { [DataMember(Order = 1)] public string ProductNumber; [DataMember(Order = 2)] public string ProductName; [DataMember(Order = 3)] public string ProductPrice; [DataMember(Order = 4)] public string ProductColor; }
ServiceContract is as below
IService1.cs
namespace WcfService10 { [ServiceContract] public interface IService1 { [OperationContract] Product GetaProduct(Product p ); } }
And Service implementation is as below,
Service1.svc.cs
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace WcfService10 { public class Service1 : IService1 { public Product GetaProduct(Product p) { Product p1 = new Product { ProductNumber = p.ProductNumber, ProductName = p.ProductName, ProductPrice = p.ProductPrice, ProductColor = p.ProductColor }; return p1; } } }
Now we have a service.
Now at the client side (Say it as client1) we are calling the service as below
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ConsoleApplication1.ServiceReference1; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { using (Service1Client proxy = new Service1Client()) { Product p = new Product{ProductNumber="1", ProductPrice="100", ProductName ="Bat", ProductColor ="White"}; var res = proxy.GetaProduct(p); Console.WriteLine(res.ProductName+"\n" + res.ProductPrice+"\n" + res.ProductNumber+"\n"+res.ProductColor); } Console.ReadKey(true); } } }
Output
Now let us go ahead and modify the service implementation as below,
Service1.svc.cs
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace WcfService10 { public class Service1 : IService1 { public Product GetaProduct(Product p) { Product p1 = new Product { ProductNumber = p.ProductNumber??"Missing Number", ProductName = p.ProductName??"Missing Name", ProductPrice = p.ProductPrice??"Missing Price", ProductColor = p.ProductColor??"Missing color" }; return p1; } } }
If you see the above implementation , we are assigning some default value when value of the property is not provided or in other words Members are missing.
So if at the client side DataContract, some DataMember is missing. In this case at the client side member ProductColor is missing
Now at the service side one DataMember is missing so Service implementation will return default value for that
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ConsoleApplication1.ServiceReference1; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { using (Service1Client proxy = new Service1Client()) { Product p = new Product{ProductNumber="1", ProductPrice="100", ProductName ="Bat"}; var res = proxy.GetaProduct(p); Console.WriteLine(res.ProductName+"\n" + res.ProductPrice+"\n" + res.ProductNumber+"\n"+res.ProductColor); } Console.ReadKey(true); } } }
Output
OnDeserializing event
In case of missing DataMember , we can use OnDeserializing event to share the logic across all the party
Product.cs
[DataContract] public class Product { [DataMember(Order = 1)] public string ProductNumber; [DataMember(Order = 2)] public string ProductName; [DataMember(Order = 3)] public string ProductPrice; [DataMember(Order = 4)] public string ProductColor; [OnDeserializing] void OnDeserializing(StreamingContext context) { ProductName = "Name Missing"; ProductNumber = "Number Missing"; ProductColor = "Color Missing "; ProductPrice = "Price Missing"; } }
Leave a Reply