Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I det här avsnittet beskrivs de grundläggande steg som krävs för att skapa en WCF-tjänst (Windows Communication Foundation) som hanteras av en Windows-tjänst. Scenariot aktiveras av det hanterade värdalternativet för Windows-tjänsten som är en långvarig WCF-tjänst som finns utanför Internet Information Services (IIS) i en säker miljö som inte är meddelandeaktiverad. Tjänstens livslängd styrs i stället av operativsystemet. Det här värdalternativet är tillgängligt i alla versioner av Windows.
Windows-tjänster kan hanteras med Microsoft.ManagementConsole.SnapIn i Microsoft Management Console (MMC) och kan konfigureras för att starta automatiskt när systemet startas. Det här värdalternativet består av att registrera programdomänen (AppDomain) som är värd för en WCF-tjänst som en hanterad Windows-tjänst så att processlivslängden för tjänsten styrs av Service Control Manager (SCM) för Windows-tjänster.
Tjänstkoden innehåller en tjänstimplementering av tjänstkontraktet, en Windows Service-klass och en installationsklass. Tjänstimplementeringsklassen, CalculatorService, är en WCF-tjänst. CalculatorWindowsService är en Windows-tjänst. För att kvalificera sig som en Windows-tjänst ärver klassen från ServiceBase och implementerar OnStart metoderna och OnStop . I OnStartskapas en ServiceHost för CalculatorService typen och öppnas. I OnStopstoppas och tas tjänsten bort. Värden ansvarar också för att tillhandahålla en basadress till tjänstvärden, som har konfigurerats i programinställningarna. Installationsklassen, som ärver från Installer, tillåter att programmet installeras som en Windows-tjänst av verktyget Installutil.exe.
Skapa tjänsten och ange värdkoden
Skapa ett nytt Visual Studio Console-appprojekt med namnet Service.
Byt namn på Program.cs till Service.cs.
Ändra namnområdet till
Microsoft.ServiceModel.Samples.Lägg till referenser till följande sammansättningar:
- System.ServiceModel.dll
- System.ServiceProcess.dll
- System.Configuration.Install.dll
Lägg till följande
usingdirektiv i Service.cs.using System.ComponentModel; using System.ServiceModel; using System.ServiceProcess; using System.Configuration; using System.Configuration.Install;Imports System.ComponentModel Imports System.ServiceModel Imports System.ServiceProcess Imports System.Configuration Imports System.Configuration.InstallDefiniera tjänstkontraktet
ICalculatorenligt följande kod.// Define a service contract. [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] public interface ICalculator { [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); }' Define a service contract. <ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _ Public Interface ICalculator <OperationContract()> _ Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double <OperationContract()> _ Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double <OperationContract()> _ Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double <OperationContract()> _ Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double End InterfaceImplementera tjänstkontraktet i en klass som heter
CalculatorServiceenligt följande kod.// Implement the ICalculator service contract in a service class. public class CalculatorService : ICalculator { // Implement the ICalculator methods. public double Add(double n1, double n2) { double result = n1 + n2; return result; } public double Subtract(double n1, double n2) { double result = n1 - n2; return result; } public double Multiply(double n1, double n2) { double result = n1 * n2; return result; } public double Divide(double n1, double n2) { double result = n1 / n2; return result; } }' Implement the ICalculator service contract in a service class. Public Class CalculatorService Implements ICalculator ' Implement the ICalculator methods. Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add Return n1 + n2 End Function Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract Return n1 - n2 End Function Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply Return n1 * n2 End Function Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide Return n1 / n2 End Function End ClassSkapa en ny klass med namnet
CalculatorWindowsServicesom ärver från ServiceBase klassen. Lägg till en lokal variabel med namnetserviceHostför att referera till instansen ServiceHost . Definiera denMainmetod som anroparServiceBase.Run(new CalculatorWindowsService)public class CalculatorWindowsService : ServiceBase { public ServiceHost serviceHost = null; public CalculatorWindowsService() { // Name the Windows Service ServiceName = "WCFWindowsServiceSample"; } public static void Main() { ServiceBase.Run(new CalculatorWindowsService()); }Public Class CalculatorWindowsService Inherits ServiceBase Public serviceHost As ServiceHost = Nothing Public Sub New() ' Name the Windows Service ServiceName = "WCFWindowsServiceSample" End Sub Public Shared Sub Main() ServiceBase.Run(New CalculatorWindowsService()) End SubÅsidosätt OnStart(String[]) metoden genom att skapa och öppna en ny ServiceHost instans enligt följande kod.
// Start the Windows service. protected override void OnStart(string[] args) { if (serviceHost != null) { serviceHost.Close(); } // Create a ServiceHost for the CalculatorService type and // provide the base address. serviceHost = new ServiceHost(typeof(CalculatorService)); // Open the ServiceHostBase to create listeners and start // listening for messages. serviceHost.Open(); }' Start the Windows service. Protected Overrides Sub OnStart(ByVal args() As String) If serviceHost IsNot Nothing Then serviceHost.Close() End If ' Create a ServiceHost for the CalculatorService type and ' provide the base address. serviceHost = New ServiceHost(GetType(CalculatorService)) ' Open the ServiceHostBase to create listeners and start ' listening for messages. serviceHost.Open() End SubÅsidosätt metoden OnStop som stänger ServiceHost enligt följande kod.
protected override void OnStop() { if (serviceHost != null) { serviceHost.Close(); serviceHost = null; } }Protected Overrides Sub OnStop() If serviceHost IsNot Nothing Then serviceHost.Close() serviceHost = Nothing End If End SubSkapa en ny klass med namnet
ProjectInstallersom ärver från Installer och som har markerats med RunInstallerAttribute värdettrue. På så sätt kan Windows-tjänsten installeras av verktyget Installutil.exe.// Provide the ProjectInstaller class which allows // the service to be installed by the Installutil.exe tool [RunInstaller(true)] public class ProjectInstaller : Installer { private ServiceProcessInstaller process; private ServiceInstaller service; public ProjectInstaller() { process = new ServiceProcessInstaller(); process.Account = ServiceAccount.LocalSystem; service = new ServiceInstaller(); service.ServiceName = "WCFWindowsServiceSample"; Installers.Add(process); Installers.Add(service); } }' Provide the ProjectInstaller class which allows ' the service to be installed by the Installutil.exe tool <RunInstaller(True)> _ Public Class ProjectInstaller Inherits Installer Private process As ServiceProcessInstaller Private service As ServiceInstaller Public Sub New() process = New ServiceProcessInstaller() process.Account = ServiceAccount.LocalSystem service = New ServiceInstaller() service.ServiceName = "WCFWindowsServiceSample" Installers.Add(process) Installers.Add(service) End Sub End ClassTa bort klassen
Servicesom genererades när du skapade projektet.Lägg till en programkonfigurationsfil i projektet. Ersätt innehållet i filen med följande konfigurations-XML.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <!-- This section is optional with the new configuration model introduced in .NET Framework 4. --> <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:8000/ServiceModelSamples/service"/> </baseAddresses> </host> <!-- this endpoint is exposed at the base address provided by host: http://localhost:8000/ServiceModelSamples/service --> <endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator" /> <!-- the mex endpoint is exposed at http://localhost:8000/ServiceModelSamples/service/mex --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <behaviors> <serviceBehaviors> <behavior name="CalculatorServiceBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="False"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>Högerklicka på filen App.config i Solution Explorer och välj Egenskaper. Under Kopiera till utdatakatalog väljer du Kopiera om nyare.
Det här exemplet anger uttryckligen slutpunkter i konfigurationsfilen. Om du inte lägger till några slutpunkter i tjänsten lägger körningen till standardslutpunkter åt dig. I det här exemplet är publiceringsmetadata aktiverade eftersom tjänsten har angetts ServiceMetadataBehavior till
true. Mer information om standardslutpunkter, bindningar och beteenden finns i Förenklad konfiguration och förenklad konfiguration för WCF-tjänster.
Installera och köra tjänsten
Skapa lösningen för att skapa den
Service.exekörbara filen.Öppna Kommandotolken för utvecklare för Visual Studio och gå till projektkatalogen. Skriv
installutil bin\service.exei kommandotolken för att installera Windows-tjänsten.Skriv
services.msci kommandotolken för att få åtkomst till Service Control Manager (SCM). Windows-tjänsten bör visas i Tjänster som "WCFWindowsServiceSample". WCF-tjänsten kan bara svara på klienter om Windows-tjänsten körs. Om du vill starta tjänsten högerklickar du på den i SCM och väljer "Start" eller skriver net start WCFWindowsServiceSample i kommandotolken.Om du gör ändringar i tjänsten måste du först stoppa den och avinstallera den. Om du vill stoppa tjänsten högerklickar du på tjänsten i SCM och väljer "Stop" eller skriver net stop WCFWindowsServiceSample i kommandotolken. Observera att om du stoppar Windows-tjänsten och sedan kör en klient uppstår ett EndpointNotFoundException undantag när en klient försöker komma åt tjänsten. Så här avinstallerar du Windows-tjänsttypen installutil /u bin\service.exe i kommandotolken.
Exempel
Följande är en fullständig lista över den kod som används av det här avsnittet:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.ServiceModel;
using System.ServiceProcess;
using System.Configuration;
using System.Configuration.Install;
namespace Microsoft.ServiceModel.Samples
{
// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}
// Implement the ICalculator service contract in a service class.
public class CalculatorService : ICalculator
{
// Implement the ICalculator methods.
public double Add(double n1, double n2)
{
double result = n1 + n2;
return result;
}
public double Subtract(double n1, double n2)
{
double result = n1 - n2;
return result;
}
public double Multiply(double n1, double n2)
{
double result = n1 * n2;
return result;
}
public double Divide(double n1, double n2)
{
double result = n1 / n2;
return result;
}
}
public class CalculatorWindowsService : ServiceBase
{
public ServiceHost serviceHost = null;
public CalculatorWindowsService()
{
// Name the Windows Service
ServiceName = "WCFWindowsServiceSample";
}
public static void Main()
{
ServiceBase.Run(new CalculatorWindowsService());
}
// Start the Windows service.
protected override void OnStart(string[] args)
{
if (serviceHost != null)
{
serviceHost.Close();
}
// Create a ServiceHost for the CalculatorService type and
// provide the base address.
serviceHost = new ServiceHost(typeof(CalculatorService));
// Open the ServiceHostBase to create listeners and start
// listening for messages.
serviceHost.Open();
}
protected override void OnStop()
{
if (serviceHost != null)
{
serviceHost.Close();
serviceHost = null;
}
}
}
// Provide the ProjectInstaller class which allows
// the service to be installed by the Installutil.exe tool
[RunInstaller(true)]
public class ProjectInstaller : Installer
{
private ServiceProcessInstaller process;
private ServiceInstaller service;
public ProjectInstaller()
{
process = new ServiceProcessInstaller();
process.Account = ServiceAccount.LocalSystem;
service = new ServiceInstaller();
service.ServiceName = "WCFWindowsServiceSample";
Installers.Add(process);
Installers.Add(service);
}
}
}
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.ComponentModel
Imports System.ServiceModel
Imports System.ServiceProcess
Imports System.Configuration
Imports System.Configuration.Install
Namespace Microsoft.ServiceModel.Samples
' Define a service contract.
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
<OperationContract()> _
Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double
End Interface
' Implement the ICalculator service contract in a service class.
Public Class CalculatorService
Implements ICalculator
' Implement the ICalculator methods.
Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add
Return n1 + n2
End Function
Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract
Return n1 - n2
End Function
Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply
Return n1 * n2
End Function
Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide
Return n1 / n2
End Function
End Class
Public Class CalculatorWindowsService
Inherits ServiceBase
Public serviceHost As ServiceHost = Nothing
Public Sub New()
' Name the Windows Service
ServiceName = "WCFWindowsServiceSample"
End Sub
Public Shared Sub Main()
ServiceBase.Run(New CalculatorWindowsService())
End Sub
' Start the Windows service.
Protected Overrides Sub OnStart(ByVal args() As String)
If serviceHost IsNot Nothing Then
serviceHost.Close()
End If
' Create a ServiceHost for the CalculatorService type and
' provide the base address.
serviceHost = New ServiceHost(GetType(CalculatorService))
' Open the ServiceHostBase to create listeners and start
' listening for messages.
serviceHost.Open()
End Sub
Protected Overrides Sub OnStop()
If serviceHost IsNot Nothing Then
serviceHost.Close()
serviceHost = Nothing
End If
End Sub
End Class
' Provide the ProjectInstaller class which allows
' the service to be installed by the Installutil.exe tool
<RunInstaller(True)> _
Public Class ProjectInstaller
Inherits Installer
Private process As ServiceProcessInstaller
Private service As ServiceInstaller
Public Sub New()
process = New ServiceProcessInstaller()
process.Account = ServiceAccount.LocalSystem
service = New ServiceInstaller()
service.ServiceName = "WCFWindowsServiceSample"
Installers.Add(process)
Installers.Add(service)
End Sub
End Class
End Namespace
Precis som med alternativet "Självvärdering" kräver Värdmiljön för Windows-tjänsten att viss värdkod skrivs som en del av programmet. Tjänsten implementeras som ett konsolprogram och innehåller en egen värdkod. I andra värdmiljöer, till exempel Windows Process Activation Service (WAS) värd i Internet Information Services (IIS), är det inte nödvändigt för utvecklare att skriva värdkod.