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.
[MessageContract]
public class EmployeeRequest
{
[MessageHeader(Namespace="http://abc.com/empReqObj")]
public string tokenKey { get; set; }
}
<getEmoloyee xmlns="http://tempuri.org/">
<id>1</id>
</getEmoloyee>
</s:Body>
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
- 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.
<getEmoloyee xmlns="http://tempuri.org/">
<id>1</id>
</getEmoloyee>
</s:Body>
- Message contract attribute has following parameters .
- IsWrapper
- WrapperName
- WrapperNamespace
- 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.
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