WCF servers and clients without configuration files
September 17, 2010 Leave a comment
WCF servers and clients can be set up using a declarative mechanism in web.config and app.config files. It is also possible to set up WCF servers and clients without using config files. A simple example follows.
For these examples the WCF server and client will be hosted in simple WPF applications.
WCF Server
A reference to the System.ServiceModel assembly / dll is added to link the associated namespaces. Then a ServiceContract is defined:
using System.ServiceModel;
...
[ServiceContract]
public interface IWCFContract
{
[OperationContract]
int Add(int value1, int value2);
[OperationContract]
int Multiply(int value1, int value2);
}
Next a concrete implementation of the service contract needs to be defined:
public class WCFConcrete : IWCFContract
{
public int Add(int value1, int value2)
{
return (value1 + value2);
}
public int Multiply(int value1, int value2)
{
return (value1 * value2);
}
}
Then the service host is programmatically created and the metadata is exposed and endpoints added:
using System.ServiceModel;
using System.ServiceModel.Description;
...
public ServiceHost CreateAndOpenHost()
{
ServiceHost newHost =
new ServiceHost(typeof(WCFConcrete),
new Uri("http://localhost:8002/SimpleService"));
// Configure publication of service metadata
ServiceMetadataBehavior behaviour = new ServiceMetadataBehavior();
behaviour.HttpGetEnabled = true;
behaviour.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
newHost.Description.Behaviors.Add(behaviour);
// Add a MEX (metadata exchange) endpoint
newHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex");
// Add an application endpoint using a WSHttpBinding
newHost.AddServiceEndpoint(typeof(IWCFContract), new WSHttpBinding(), "");
// Open the service host
newHost.Open();
return newHost;
}
Appropriate permissions will need to be given to the user running the application. This can be achieved by running the following in an elevated / administrator command window:
netsh http add urlacl url=http://+:8002/SimpleService user=DOMAIN\username
This service can now be run. The running service can be verified by browsing to the service in Internet Explorer:
http://localhost:8002/SimpleService
WCF Client
To create the client class run the svcutil.exe (located at C:\Program Files\Microsoft SDKs\Windows\{version}\Bin) on the wsdl for the service (while the service is running):
svcutil.exe http://localhost:8002/SimpleService?wsdl
This will create a WCFConcrete.cs (along with a config file which is not needed for this example.) This class file is added to the client project. Again a reference to the System.ServiceModel assembly will need to be added to the client project.
The ChannelFactory is then used to create a client to the service:
using System.ServiceModel;
...
public static IWCFContract CreateWCFClient(String endpointAddress)
{
IWCFContract result = null;
// Set up the binding and endpoint.
WSHttpBinding binding = new WSHttpBinding();
EndpointAddress endpoint = new EndpointAddress(endpointAddress);
// Create a channel factory.
ChannelFactory<IWCFContract> channelFactory =
new ChannelFactory<IWCFContract>(binding, endpoint);
// Create a channel.
result = channelFactory.CreateChannel();
return result;
}
With this in place a client can simply be created and used to access the service (when it is running):
...
IWCFContract client = CreateWCFClient("http://localhost:8002/SimpleService");
int addResult = client.Add(2, 3);
int multiplyResult = client.Multiply(2, 3);