Monday, 25 May 2015

Message Contract in WCF.

Data contract provide us limited control over request and response XML messages in WCF.If we want full control over request and response xml use MessageContract.

  • In general user message contract only if there is a reason ti tweak the structure of soap xml message.
  • If we want to include some custom data in soap header we can use message contract. Refer following example.

    [MessageContract]
    public class EmployeeRequest
    {
        [MessageHeader(Namespace="http://abc.com/empReqObj")]
        public string tokenKey { get; set; }      
    }

  • Want to change the name of wrapper element in soap message use message contract.Wrapper element is nothing but the name of operation contract.In below soap request message getEmployee is a wrapper element.
<s:Body>
       <getEmoloyee xmlns="http://tempuri.org/">
             <id>1</id>
       </getEmoloyee>
</s:Body>
  • Message contract attribute has following parameters .
  1. IsWrapper
  2. WrapperName
  3. WrapperNamespace
  4. ProtectionLevel
  • Message header attribute is applied on property of the class that you want to include in soap header section.
  • Message body attribute is applied on property of the class that you want to include in soap body section.
 [MessageContract( WrapperName="EmployeeReqObject", IsWrapped=true,  WrapperNamespace="http://abc.com/empReqObj")]
    public class EmployeeRequest
    {
        [MessageHeader(Namespace="http://abc.com/empReqObj")]
        public string tokenKey { get; set; }
        [MessageBodyMember(Namespace="http://abc.com/empReqObj")]
        public int EmployeeID { get; set; }
    }

Programming Example :

Soap request request and response messages without using message contract is as follows.

Req soap xml :

 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
     <s:Header>
     </s:Header>
     <s:Body>
         <getEmoloyee xmlns="http://tempuri.org/">
              <id>1</id>
         </getEmoloyee>
      </s:Body>
</s:Envelope>

Response soap xml :

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header></s:Header>
    <s:Body>
        <getEmoloyeeResponse xmlns="http://tempuri.org/">
        <getEmoloyeeResult i:type="b:FullTimeEmployee" xmlns:a="http://abc.com/employee"
         xmlns:b="http://schemas.datacontract.org/2004/07/WcfService1">
               <a:empAddress>gurgaon</a:empAddress>
               <a:empID>1</a:empID>
               <a:empName>rahul</a:empName>
               <b:HourPaid>1000</b:HourPaid>
               <b:HourWorked>8</b:HourWorked>
               </getEmoloyeeResult>
         </getEmoloyeeResponse>
     </s:Body>
</s:Envelope>









Request and response soap xml after tweaking with message contract :

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
      <h:tokenKey xmlns:h="http://abc.com/empReqObj">GHR45TY56HJ</h:tokenKey>
      <ActivityId CorrelationId="e9898ec9-1a36-4d7d-b41e-85d536d8f8b2"
       xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">a6ff8893-293d-4476
      -8f4a-cdefb16ca5fa</ActivityId>
</s:Header>
<s:Body>
        <EmployeeReqObject xmlns="http://abc.com/empReqObj">
           <EmployeeID>1</EmployeeID>
        </EmployeeReqObject>
</s:Body>
</s:Envelope>


<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header></s:Header>
<s:Body>
     <EmployeeInfoObject xmlns="http://abc.com/empReqObj">
        <EmployeeID>1</EmployeeID>
        <EmployeeName>rahul</EmployeeName>
        <EmployeeAddress>gurgaon</EmployeeAddress>
        <EmployeeHourPay>1000</EmployeeHourPay>
        <EmployeeHourWork>8</EmployeeHourWork>
        <EmployeeSalary>0</EmployeeSalary>
        <EmployeeType>1</EmployeeType>
     </EmployeeInfoObject>
</s:Body>
</s:Envelope>


C#  Code:


 [MessageContract( WrapperName="EmployeeReqObject", IsWrapped=true, WrapperNamespace="http://abc.com/empReqObj")]
    public class EmployeeRequest
    {
        [MessageHeader(Namespace="http://abc.com/empReqObj")]
        public string tokenKey { get; set; }
        [MessageBodyMember(Namespace="http://abc.com/empReqObj")]
        public int EmployeeID { get; set; }
    }

    [MessageContract(WrapperName = "EmployeeInfoObject", IsWrapped = true, WrapperNamespace = "http://abc.com/empReqObj")]
    public class EmployeeInfo
    {
        public EmployeeInfo()
        { }
        public EmployeeInfo(Employee emp)
        {
            this.EmployeeID = emp.empID;
            this.EmployeeName = emp.empName;
            this.EmployeeAddress = emp.empAddress;
            this.EmployeeType = emp.empType;
            if (emp.empType == 2)
                this.EmployeeSalary = ((PartTimeEmployee)emp).Salary;
            else
            {
                this.EmployeeHourPay = ((FullTimeEmployee)emp).HourPaid;
                this.EmployeeHourWork = ((FullTimeEmployee)emp).HourWorked;
            }
        }
        [MessageBodyMember(Namespace = "http://abc.com/empReqObj", Order = 1)]
        public int EmployeeID { get; set; }
        [MessageBodyMember(Namespace = "http://abc.com/empReqObj", Order = 2)]
        public string EmployeeName { get; set; }
        [MessageBodyMember(Namespace = "http://abc.com/empReqObj", Order = 3)]
        public string EmployeeAddress { get; set; }

        [MessageBodyMember(Namespace = "http://abc.com/empReqObj", Order = 3)]
        public int EmployeeSalary { get; set; }

        [MessageBodyMember(Namespace = "http://abc.com/empReqObj", Order = 3)]
        public int EmployeeHourPay { get; set; }

        [MessageBodyMember(Namespace = "http://abc.com/empReqObj", Order = 3)]
        public int EmployeeHourWork { get; set; }


        [MessageBodyMember(Namespace = "http://abc.com/empReqObj", Order = 3)]
        public int EmployeeType { get; set; }

    }
   


    //[KnownType(typeof(PartTimeEmployee))]
    //[KnownType(typeof(FullTimeEmployee))]
    [DataContract(Namespace="http://abc.com/employee")]
    public class Employee
    {
        [DataMember]
        public int empID { get; set; }
        [DataMember]
        public string empName { get; set; }
        [DataMember]
        public string empAddress { get; set; }
        [DataMember]
        public int empType { get; set; } //1 for full time and 2 for part time

    }
    public class PartTimeEmployee : Employee
    {
        public int Salary { get; set; }
    }
    public class FullTimeEmployee : Employee
    {
        public int HourWorked { get; set; }
        public int HourPaid { get; set; }
    }






IService1.cs :


 [ServiceContract]
    public interface IService1
    {

        [OperationContract]
        void saveEmoloyee(EmployeeInfo emp);
        [OperationContract]
        EmployeeInfo getEmoloyee(EmployeeRequest req);
              
        // TODO: Add your service operations here
    } 


 Service1.svc.cs :

public class Service1 : IService1
    {

        public void saveEmoloyee(EmployeeInfo emp)
        {
        //code for save here 
        }

        public EmployeeInfo getEmoloyee(EmployeeRequest req)
        {
            Employee emp = null;
            if (req.EmployeeID == 1)
            {
                emp = new FullTimeEmployee { empID = 1, empType=1, empAddress = "gurgaon", empName = "rahul", HourPaid = 1000, HourWorked = 8 };
            }
            else
            {
                emp = new PartTimeEmployee { empID = 1, empType=2, empAddress = "gurgaon", empName = "rahul", Salary = 50000 };
            }
            return new EmployeeInfo(emp);
        }
    }


ClientApplication.aspx.cs :


 protected void btn1_Click(object sender, EventArgs e)
        {
            ServiceReference1.EmployeeRequest objReq = new ServiceReference1.EmployeeRequest();
            ServiceReference1.EmployeeInfo empInfo = new ServiceReference1.EmployeeInfo();
            objReq.EmployeeID = 1;
            objReq.tokenKey = "GHR45TY56HJ";

            ServiceReference1.IService1 client = new ServiceReference1.Service1Client();
            empInfo = client.getEmoloyee(objReq);

            if (empInfo.EmployeeType == 1)
            {
                string name = empInfo.EmployeeName;
                int hourPaid = empInfo.EmployeeHourPay;
                int hourworked = empInfo.EmployeeHourWork;
            }
            else
            {
                int salary = empInfo.EmployeeSalary;
            }
           
        }




Related Post :

Different-option-of-hosting-wcf-service
Binding-in-wcf-choosing-right-wcf
Exchanging-metadata-in-wcf
Some-interesting-facts-about-data-contract
Knowntype-attribute-in-wcf
Associating-knowntype-in-wcf
Message-contract-in-wcf
Exception-handling-in-wcf
Exception Handling in WCF - SOAP Fault in WCF
Exception Handling in WCF - Unhandled Exception in WCF
Exception Handling in WCF - Creating and Throwing Strongly Typed SOAP Fault











No comments:

Post a Comment