–
–
–
–
In this example, I share a listenUri between two endpoints.
Synopsis:
We have one service implementation that has two service contracts.
Each service contract will have it’s own endpoint.
Each endpoint will share a listenUri.
We’ve also setup an endpoint for our metadata exchange.
I’ve done all of this imperatively.
–
Service code
using System.ServiceModel; using System.ServiceModel.Description; namespace Service { [ServiceContract] public interface IGetHeaders { [OperationContract] string GetHeaders(); } [ServiceContract] public interface ICalculate { [OperationContract] double Sum(double[] values); } public class HeaderService : IGetHeaders, ICalculate { public string GetHeaders() { return OperationContext.Current.RequestContext.RequestMessage.Headers.Action; } public double Sum(double[] values) { double result = 0.0; foreach (double value in values) result += value; return result; } } public class Program { public static void Main() { Uri baseAddress = new Uri("net.tcp://localhost:8241/Service"); Uri listenUri = new Uri("net.tcp://localhost:8241/MyListenUri"); ServiceHost serviceHost = new ServiceHost(typeof(HeaderService), new Uri[] {baseAddress}); NetTcpBinding netTcpBinding = new NetTcpBinding(); serviceHost.AddServiceEndpoint(typeof(IGetHeaders), netTcpBinding, "/GetHeaders", listenUri); serviceHost.AddServiceEndpoint(typeof(ICalculate), netTcpBinding, "/Calculate", listenUri); ExposeMetadata(serviceHost); serviceHost.Open(); Console.WriteLine("Host running..."); Console.WriteLine("Service {0} hosted and {1} to receive requests", serviceHost.Description.Name, serviceHost.State); Console.WriteLine("press Enter to terminate"); Console.ReadLine(); serviceHost.Close(); } private static void ExposeMetadata(ServiceHost serviceHost) { //Check to see if the service host already has a ServiceMetadataBehavior ServiceMetadataBehavior serviceMetadataBehavior = serviceHost.Description.Behaviors.Find<ServiceMetadataBehavior>(); //If not, add one if(serviceMetadataBehavior == null) serviceMetadataBehavior = new ServiceMetadataBehavior(); serviceMetadataBehavior.HttpGetEnabled = true; Uri mexUri = new Uri("http://localhost:8242/Service/Mex"); serviceMetadataBehavior.HttpGetUrl = mexUri; serviceMetadataBehavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; serviceHost.Description.Behaviors.Add(serviceMetadataBehavior); //Add MEX endpoint serviceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), mexUri); } } }
–
Client code
using System; using System.ServiceModel; using System.ServiceModel.Description; namespace Client { class Program { static void Main(string[] args) { NetTcpBinding netTcpBinding = new NetTcpBinding(); Uri myListenUri = new Uri("net.tcp://localhost:8241/MyListenUri"); ServiceProxy.GetHeadersClient getHeadersProxy = new ServiceProxy.GetHeadersClient(netTcpBinding, new EndpointAddress("net.tcp://localhost:8241/Service/GetHeaders")); getHeadersProxy.Endpoint.Behaviors.Add(new ClientViaBehavior(myListenUri)); ServiceProxy.CalculateClient calculateProxy = new ServiceProxy.CalculateClient(netTcpBinding, new EndpointAddress("net.tcp://localhost:8241/Service/Calculate")); calculateProxy.Endpoint.Behaviors.Add(new ClientViaBehavior(myListenUri)); Console.WriteLine("Press Enter to exercise GetHeaders"); Console.ReadLine(); Console.WriteLine("And the header is: {0}{1}", getHeadersProxy.GetHeaders(), Environment.NewLine); Console.WriteLine("Press Enter to exercise Sum"); Console.ReadLine(); Console.WriteLine("And the sum is: {0}{1}", calculateProxy.Sum(new double[] { 1.4, 3.5, 7.8 }), Environment.NewLine); Console.WriteLine("press Enter to terminate"); Console.ReadLine(); } } }
Click on link below to download full source code.
{
public static void Main()
{
Uri baseAddress = new Uri(“net.tcp://localhost:8241/Service”);
Uri listenUri = new Uri(“net.tcp://localhost:8241/MyListenUri”);
ServiceHost serviceHost = new ServiceHost(typeof(HeaderService), new Uri[] {baseAddress});
NetTcpBinding netTcpBinding = new NetTcpBinding();
serviceHost.AddServiceEndpoint(typeof(IGetHeaders),
netTcpBinding, “/GetHeaders”, listenUri);
serviceHost.AddServiceEndpoint(typeof(ICalculate),
netTcpBinding, “/Calculate”, listenUri);
ExposeMetadata(serviceHost);
serviceHost.Open();
Console.WriteLine(“Host running…”);
Console.WriteLine(“Service {0} hosted and {1} to receive requests”, serviceHost.Description.Name, serviceHost.State);
Console.WriteLine(“press Enter to terminate”);
Console.ReadLine();
serviceHost.Close();
}
private static void ExposeMetadata(ServiceHost serviceHost)
{
// Check to see if the service host already has a ServiceMetadataBehavior
ServiceMetadataBehavior serviceMetadataBehavior = serviceHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
// If not, add one
if (serviceMetadataBehavior == null)
serviceMetadataBehavior = new ServiceMetadataBehavior();
serviceMetadataBehavior.HttpGetEnabled = true;
Uri mexUri = new Uri(“http://localhost:8242/Service/Mex”);
serviceMetadataBehavior.HttpGetUrl = mexUri;
serviceMetadataBehavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
serviceHost.Description.Behaviors.Add(serviceMetadataBehavior);
// Add MEX endpoint
serviceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), mexUri);
}
}
SingleServiceListenUriTwoEndpoints.zip – 20.98 KB
Once you’ve built the solution, navigate to
Service\bin\Debug\Service.exe and run it.
You should see output like the following.
Now run the Client project in the debugger.
You should see output like the following, once you’ve hit Enter twice.
This is also a good read on the differences between
Logical vs. Physical Addresses.
Leave a Reply