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);