WCF + Message Contract – to encapsulate the SOAP Request & the SOAP Response Envelop with Header & Body Message
( SOAP Server ) IService.cs |
using System; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; namespace WCFService { [ServiceContract] public interface IService { [OperationContract] Output GetData(Input value); } [MessageContract] public class Input { [MessageHeader] public string InputHeader; [MessageBodyMember] public string InputBodyMember; } [MessageContract] public class Output { [MessageHeader] public OutputHeader OutputHeader; [MessageBodyMember] public Data OutputBodyMember; } [DataContract] public class Data { [DataMember] public string itema; [DataMember] public string itemb; } [DataContract] public class OutputHeader { [DataMember] public string headera; [DataMember] public string headerb; } } |
( SOAP Server ) Service.svc.cs |
using System; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; namespace WCFService { public class Service : IService { public Output GetData(Input value) { Output aoutput = new Output(); output.OutputBodyMember = new Data(); output.OutputHeader = new OutputHeader(); output.OutputBodyMember.itema = value.InputBodyMember + " : 1"; output.OutputBodyMember.itemb = value.InputBodyMember + " : 2"; output.OutputHeader.headera = value.InputHeader + " : Header 1"; output.OutputHeader.headerb = value.InputHeader + " : Header 2"; return output; } } } |
( SOAP Client ) Main.cs |
using System; using System.Collections.Generic; using System.ServiceModel; using WCFConsoleApp.HeaderServiceReference; using System.Configuration; namespace WCFConsoleApp { class Program { static void Main(string[] args) { EndpointAddress endpoint = new EndpointAddress(ConfigurationManager.AppSettings["SOAPEndPoint"].ToString()); ServiceClient client = new ServiceClient(new BasicHttpBinding(), endpoint); HeaderServiceReference.Input input = new HeaderServiceReference.Input(); input.InputBodyMember = "Body"; input.InputHeader = "Header"; HeaderServiceReference.Data data; HeaderServiceReference.OutputHeader outputheader = client.GetData(input.InputHeader, input.InputBodyMember, out data); Console.WriteLine(data.itema + " / " + data.itemb); Console.ReadLine(); } } } |
SOAP Request and SOAP Response Envelop ( Execute the Result from Visual Studio or SOAPUI ) |
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Header> <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none"> http://tempuri.org/IService/GetData </Action> <h:InputHeader xmlns:h="http://tempuri.org/">Header</h:InputHeader> </s:Header> <s:Body> <Input xmlns="http://tempuri.org/"> <InputBodyMember>BodyMember</InputBodyMember> </Input> </s:Body> </s:Envelope> |
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Header> <h:OutputHeader xmlns:h="http://tempuri.org/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <headera xmlns="http://schemas.datacontract.org/2004/07/WCFService">Header : Header 1</headera> <headerb xmlns="http://schemas.datacontract.org/2004/07/WCFService">Header : Header 2</headerb> </h:OutputHeader> </s:Header> <s:Body> <Output xmlns="http://tempuri.org/"> <OutputBodyMember xmlns:a="http://schemas.datacontract.org/2004/07/WCFService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <a:itema>BodyMember : Body 1</a:itema> <a:itemb>BodyMember : Body 2</a:itemb> </OutputBodyMember> </Output> </s:Body> </s:Envelope> |