Export (0) Print
Expand All

How to: Host a WCF Service in a Managed Application

To host a service inside a managed application, embed the code for the service inside the managed application code, define an endpoint for the service either imperatively in code, declaratively through configuration, or using default endpoints, and then create an instance of ServiceHost.

To start receiving messages, call Open on ServiceHost. This creates and opens the listener for the service. Hosting a service in this way is often referred to as "self-hosting" because the managed application is doing the hosting work itself. To close the service, call CommunicationObject.Close on ServiceHost.

A service can also be hosted in a managed Windows service, in Internet Information Services (IIS), or in Windows Process Activation Service (WAS). For more information about hosting options for a service, see Hosting Services.

Hosting a service in a managed application is the most flexible option because it requires the least infrastructure to deploy. For more information about hosting services in managed applications, see Hosting in a Managed Application.

The following procedure demonstrates how to implement a self-hosted service in a console application.

To create a self-hosted service

  1. Open Visual Studio 2012 and select New, Project... from the File menu.

  2. In the Installed Templates list, select Visual C#, Windows or Visual Basic, Windows. Depending on your Visual Studio 2012 settings, one or both of these may be under the Other Languages node in the Installed Templates list.

  3. Select Console Application from the Windows list. Type SelfHost in the Name box and click OK.

  4. Right-click SelfHost in Solution Explorer and select Add Reference.... Select System.ServiceModel from the .NET tab and click OK.

    Tip Tip

    If the Solution Explorer window is not visible, select Solution Explorer from the View menu.

  5. Double-click Program.cs or Module1.vb in Solution Explorer to open it in the code window if it is not already open. Add the following statements at the top of the file.

    
    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    
    
  6. Define and implement a service contract. This example defines a HelloWorldService that returns a message based on the input to the service.

    
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }
    
    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }
    
    
    
    Note Note

    For more information about how to define and implement a service interface, see How to: Define a Windows Communication Foundation Service Contract and How to: Implement a Windows Communication Foundation Service Contract.

  7. At the top of the Main method, create an instance of the Uri class with the base address for the service.

    
    Uri baseAddress = new Uri("http://localhost:8080/hello");
    
    
    
  8. Create an instance of the ServiceHost class, passing a Type that represents the service type and the base address Uniform Resource Identifier (URI) to the ServiceHost(Type, Uri[]). Enable metadata publishing, and then call the Open method on the ServiceHost to initialize the service and prepare it to receive messages.

    
    // Create the ServiceHost.
    using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
    {
        // Enable metadata publishing.
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        host.Description.Behaviors.Add(smb);
    
        // Open the ServiceHost to start listening for messages. Since
        // no endpoints are explicitly configured, the runtime will create
        // one endpoint per base address for each service contract implemented
        // by the service.
        host.Open();
    
        Console.WriteLine("The service is ready at {0}", baseAddress);
        Console.WriteLine("Press <Enter> to stop the service.");
        Console.ReadLine();
    
        // Close the ServiceHost.
        host.Close();
    }
    
    
    
    Note Note

    This example uses default endpoints, and no configuration file is required for this service. If no endpoints are configured, then the runtime creates one endpoint for each base address for each service contract implemented by the service. For more information about default endpoints, see Simplified Configuration and Simplified Configuration for WCF Services.

  9. Press CTRL+SHIFT+B to build the solution.

To test the service

  1. Press Ctrl + F5 to run the service.

  2. Open WCF Test Client.

    Tip Tip

    To open WCF Test Client, open a Visual Studio 2012 command prompt and execute WcfTestClient.exe.

  3. Select Add Service... from the File menu.

  4. Type http://localhost:8080/hello into the address box and click OK.

    Tip Tip

    Make sure the service is running or else this step fails. If you have changed the base address in the code, then use the modified base address in this step.

  5. Double-click SayHello under the My Service Projects node. Type your name into the Value column in the Request list, and click Invoke. A reply message appears in the Response list.

The following example creates a ServiceHost object to host a service of type HelloWorldService, and then calls the Open method on ServiceHost. A base address is provided in code, metadata publishing is enabled, and default endpoints are used.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace SelfHost
{
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }

    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("http://localhost:8080/hello");

            // Create the ServiceHost.
            using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
            {
                // Enable metadata publishing.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                host.Description.Behaviors.Add(smb);

                // Open the ServiceHost to start listening for messages. Since
                // no endpoints are explicitly configured, the runtime will create
                // one endpoint per base address for each service contract implemented
                // by the service.
                host.Open();

                Console.WriteLine("The service is ready at {0}", baseAddress);
                Console.WriteLine("Press <Enter> to stop the service.");
                Console.ReadLine();

                // Close the ServiceHost.
                host.Close();
            }
        }
    }
}


Show:
© 2014 Microsoft