In this post we are going to see how to invoke a WCF service in client. For that now we are going to create a WCF service and host using windows service.
Step 1 . Open visual studio 2010
Step 2 Create a New Project by select WCF Service Library.
Service have created with default methods which is mention as follows.
public class Service1 : IService1
{
public string
GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType
GetDataUsingDataContract(CompositeType
composite)
{
if (composite == null)
{
throw new
ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int
value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: Add your service operations here
}
{
ServiceHost host = new
ServiceHost(typeof(WCF1.Service1));
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[]
args)
{
try
{
System.Threading.Thread.Sleep(20000);
host.Open();
}
catch(Exception
ex)
{
Console.WriteLine(ex.Message);
}
}
protected override void OnStop()
{
host.Close();
}
}
Step 5 Add a App.Config file.
Now add important thing in App.config file for Host service in computer : ABC
i.e is A - Address, B- Binding , C - Contract
<system.serviceModel>
<services>
<service name="WCF1.Service1">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8085/sam"/>
<add baseAddress="net.tcp://localhost:9085/sam"/>
</baseAddresses>
</host>
<endpoint address="testservice" binding="wsHttpBinding" contract="WCF1.IService1">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="testservice" binding="netTcpBinding" contract="WCF1.IService1"></endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information,
set the value below to false and
remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="True"/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception
information -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Now Install the windows service in computer now WCF service is hosted in two bindings TcpBinding and WsHttpBinding. Tcp uses 9085 port and Http uses 8085 port for connecting to client.
Now Service is ready, Here we have two ways to connect a client to service
Two ways
1. Create a Proxy by add reference and call the object uses the client.
2. using ChannelFactory
Invoke WCF service using client. Create a Console application
Method 1:
Add a Service Reference using the address "http://localhost:8085/sam/testservice" for Http now proxy class is created automatically.
ServiceReference1.Service1Client
client = new ServiceReference1.Service1Client();
Console.WriteLine(client.GetData(3););
Console.Read();
Output :
You Entered : 3
Method 2:
In method 2 we are using Channel Factory to call the Service in this method , there is one advantage if the contract is changes with additional method. we don't need to worry about that because we are getting the instance from the create channel , to work just we need to add the service contract as reference.
we need binding , address and channellFactory object to create a instance of service.
WSHttpBinding bind = new
WSHttpBinding();
NetTcpBinding tcpbind = new
NetTcpBinding();
EndpointAddress addr = new
EndpointAddress(@"net.tcp://localhost:9085/sam/testservice");
ChannelFactory<WCF1.IService1>
serv = new ChannelFactory<WCF1.IService1>(tcpbind, addr);
WCF1.IService1
servpro= serv.CreateChannel();
string f=servpro.GetData(3);
Console.WriteLine(f);
Console.Read();
Output :
You Entered : 3
From this post i hope that you are able to understand the various method of invoking a WCF service from client.
No comments:
Post a Comment