Procedure: Een WCF-service hosten in een beheerde app
Als u een service in een beheerde toepassing wilt hosten, sluit u de code voor de service in de code van de beheerde toepassing in, definieert u een eindpunt voor de service die imperatief in code staat, declaratief via configuratie of met behulp van standaardeindpunten, en maakt u vervolgens een exemplaar van ServiceHost.
Als u berichten wilt ontvangen, belt u Open op ServiceHost. Hiermee wordt de listener voor de service gemaakt en geopend. Het hosten van een service op deze manier wordt vaak 'selfhosting' genoemd, omdat de beheerde toepassing het hostingwerk zelf uitvoert. Als u de service wilt sluiten, roept u aan CommunicationObject.Close ServiceHost.
Een service kan ook worden gehost in een beheerde Windows-service, in Internet Information Services (IIS) of in Windows Process Activation Service (WAS). Zie Hostingservices voor meer informatie over hostingopties voor een service.
Het hosten van een service in een beheerde toepassing is de meest flexibele optie, omdat hiervoor de minste infrastructuur is vereist om te implementeren. Zie Hosting in een beheerde toepassing voor meer informatie over het hosten van services in beheerde toepassingen.
De volgende procedure laat zien hoe u een zelf-hostende service implementeert in een consoletoepassing.
Een zelf-hostende service maken
Maak een nieuwe consoletoepassing:
Open Visual Studio en selecteer Nieuw>project in het menu Bestand.
Selecteer Visual C# of Visual Basic in de lijst Geïnstalleerde sjablonen en selecteer vervolgens Windows Desktop.
Selecteer de console-app-sjabloon . Typ
SelfHost
het vak Naam en kies OK.
Klik met de rechtermuisknop op SelfHost in Solution Explorer en selecteer Verwijzing toevoegen. Selecteer System.ServiceModel op het tabblad .NET en kies VERVOLGENS OK.
Tip
Als het venster Solution Explorer niet zichtbaar is, selecteert u Solution Explorer in het menu Beeld .
Dubbelklik op Program.cs of Module1.vb in Solution Explorer om deze te openen in het codevenster als deze nog niet is geopend. Voeg de volgende instructies toe boven aan het bestand:
using System.ServiceModel; using System.ServiceModel.Description;
Imports System.ServiceModel Imports System.ServiceModel.Description
Definieer en implementeer een servicecontract. In dit voorbeeld wordt een
HelloWorldService
bericht gedefinieerd dat wordt geretourneerd op basis van de invoer voor de 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); } }
<ServiceContract()> Public Interface IHelloWorldService <OperationContract()> Function SayHello(ByVal name As String) As String End Interface Public Class HelloWorldService Implements IHelloWorldService Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello Return String.Format("Hello, {0}", name) End Function End Class
Notitie
Zie How to: Define a Service Contract and How to: Define a Service Contract and How to: Implement a Service Contract( Een servicecontract implementeren) voor meer informatie over het definiëren en implementeren van een service-interface.
Maak boven aan de
Main
methode een exemplaar van de Uri klasse met het basisadres voor de service.Uri baseAddress = new Uri("http://localhost:8080/hello");
Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
Maak een exemplaar van de ServiceHost klasse, waarbij een Type instantie wordt doorgegeven die het servicetype en de URI (Uniform Resource Identifier) van het basisadres aan de ServiceHost(Type, Uri[])klasse vertegenwoordigt. Schakel het publiceren van metagegevens in en roep vervolgens de Open methode aan voor de ServiceHost service om de service te initialiseren en voor te bereiden op het ontvangen van berichten.
// 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 {baseAddress}"); Console.WriteLine("Press <Enter> to stop the service."); Console.ReadLine(); // Close the ServiceHost. host.Close(); }
' Create the ServiceHost. Using host As New ServiceHost(GetType(HelloWorldService), baseAddress) ' Enable metadata publishing. Dim smb As 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() End Using
Notitie
In dit voorbeeld worden standaardeindpunten gebruikt en is er geen configuratiebestand vereist voor deze service. Als er geen eindpunten zijn geconfigureerd, maakt de runtime één eindpunt voor elk basisadres voor elk servicecontract dat door de service wordt geïmplementeerd. Zie Vereenvoudigde configuratie en vereenvoudigde configuratie voor WCF-services voor meer informatie over standaardeindpunten.
Druk op Ctrl+Shift+B om de oplossing te bouwen.
De service testen
Druk op Ctrl+F5 om de service uit te voeren.
Open de WCF-testclient.
Tip
Als u de WCF-testclient wilt openen, opent u de opdrachtprompt voor Ontwikkelaars voor Visual Studio en voert u WcfTestClient.exe uit.
Selecteer Service toevoegen in het menu Bestand .
Typ
http://localhost:8080/hello
in het adresvak en klik op OK.Tip
Zorg ervoor dat de service wordt uitgevoerd of anders mislukt deze stap. Als u het basisadres in de code hebt gewijzigd, gebruikt u het gewijzigde basisadres in deze stap.
Dubbelklik op SayHello onder het knooppunt Mijn serviceprojecten. Typ uw naam in de kolom Waarde in de lijst Met aanvragen en klik op Aanroepen.
Er wordt een antwoordbericht weergegeven in de lijst Met antwoorden .
Opmerking
In het volgende voorbeeld wordt een ServiceHost object gemaakt voor het hosten van een service van het type HelloWorldService
en wordt de Open methode vervolgens aangeroepen.ServiceHost Er wordt een basisadres opgegeven in code, het publiceren van metagegevens is ingeschakeld en standaardeindpunten worden gebruikt.
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 {baseAddress}");
Console.WriteLine("Press <Enter> to stop the service.");
Console.ReadLine();
// Close the ServiceHost.
host.Close();
}
}
}
}
Imports System.ServiceModel
Imports System.ServiceModel.Description
Module Module1
<ServiceContract()>
Public Interface IHelloWorldService
<OperationContract()>
Function SayHello(ByVal name As String) As String
End Interface
Public Class HelloWorldService
Implements IHelloWorldService
Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
Return String.Format("Hello, {0}", name)
End Function
End Class
Sub Main()
Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
' Create the ServiceHost.
Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)
' Enable metadata publishing.
Dim smb As 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()
End Using
End Sub
End Module
Zie ook
- Uri
- AppSettings
- ConfigurationManager
- Procedure: Een WCF-service hosten in IIS
- Zelfhost
- Hostingservices
- Procedure: Een servicecontract definiëren
- Procedure: Een servicecontract implementeren
- Hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe)
- Bindingen gebruiken om services en clients te configureren
- Door het systeem geleverde bindingen