Virtual Developer Workshop: Containerized Development with Docker
Services: We all love them, but we all hate them. WCF services can get quite tricky because they are so sensitive, but once you get the hang of them, they can become very easy, very quickly. Today, you will learn how to host a WCF RESTFul service inside a Windows Service.
The Windows Communication Foundation (WCF) enables you to build service-oriented applications. Service-oriented applications mean that you have a back-end and a front-end communicating successfully with one another. The back-end is the physical service that reads messages, or data from a source that can be another WCF service, a Windows Service, a Web site, or even a mobile phone. The messages between the front-end and back-end are sent asynchronously. Data that can be sent from and to the service can be in XML or Raw format; in other words, binary data, and JSON. Here is more information on WCF.
REST is not tied to any particular technology or platform. It's simply a way to design things to work like the Web.
Create a new Windows Service project in Visual Basic. You may name it anything you want. Keep in mind, though, that I have named mine 'TestService'.
Create a common Namespace above the Class declaration of TestService.
Create the TestService class:
<ServiceBehavior(InstanceContextMode:= _ InstanceContextMode.PerSession)> _ Public Class TestService Inherits ServiceBase Public serviceHost As ServiceHost = Nothing Public Shared Sub Main() ServiceBase.Run(New TestService()) End Sub Public Sub New() ServiceName = "Test Service" End Sub 'Start the Windows service. Protected Overloads Overrides Sub OnStart(ByVal args _ As String()) Try If serviceHost IsNot Nothing Then serviceHost.Close() End If serviceHost = New WebServiceHost(GetType(cTestService), _ New Uri("http://localhost/TestService")) serviceHost.AddServiceEndpoint(GetType(ITestService), _ New WebHttpBinding(), "http://localhost/TestService") serviceHost.Open() Catch ex As Exception System.Diagnostics.EventLog.WriteEntry("Test Service", _ ex.Message, EventLogEntryType.Error) WebOperationContext.Current.OutgoingResponse.StatusCode = 501 serviceHost.Close() End End Try End Sub ' Stop the Windows service. Protected Overloads Overrides Sub OnStop() If serviceHost IsNot Nothing Then serviceHost.Close() serviceHost = Nothing End If End Sub End Class
Here, you create the TestService class, which is the Windows Service that will spawn the WCF Service from within. You specify how the service should behave via the ServiceBehaviour setting.
You created the onStart and OnStop events to set up the service and specify its associated EndPoints.
Endpoints provide clients with access to the functionality a Windows Communication Foundation (WCF) service offers. You can define one or more endpoints for a service by using a combination of relative and absolute endpoint addresses, or if you do not define any service endpoints, the runtime provides some by default for you. This topic shows how to add endpoints using a configuration file that contain both relative and absolute addresses.
Add the following code to give the WCF Service some work to do:
<AspNetCompatibilityRequirements(Requirementsmode:= _ AspNetCompatibilityRequirementsMode.Allowed)> _ Public Class cTestService Inherits System.Web.Services.WebService Implements ITestService Function GetCustomers() As Stream Implements _ ITestService.GetCustomers Try 'Do what you want here 'Successful WebOperationContext.Current.OutgoingResponse.StatusCode = 200 WebOperationContext.Current.OutgoingResponse.StatusDescription _ = "OK" Catch ex As Exception System.Diagnostics.EventLog.WriteEntry("Test Service", _ ex.Message, EventLogEntryType.Error) WebOperationContext.Current.OutgoingResponse.StatusCode = 501 WebOperationContext.Current.OutgoingResponse.StatusDescription _ = ex.Message End Try End Function End Class
This is just a skeleton, as you can see, but it demonstrates how you should populate the WCF Service with a method. All that is needed now is to create an Interface for the GetCustomers method.
Add a new class and add the following code into it:
Imports System.ServiceModel.Web Imports System.ServiceModel.Channels Imports System.Text Imports System.IO Namespace TestService <ServiceContract()> _ Public Interface ITestService <OperationContract()> _ <WebGet(BodyStyle:=WebMessageBodyStyle.Bare, _ ResponseFormat:=WebMessageFormat.Json, RequestFormat:=WebMessageFormat.Json)> _ Function GetCustomers() As Stream End Interface End Namespace
This creates a WCF Interface so that the WCF service knows which methods to expect.
You may now add a Setup & Deployment project which will allow you to install this service on any Windows system.
Now that you've seen an example—and you can download the code from the link below—you'll be proficient with WCF programming in no time. Until next time, cheers!