Anvisningar: Vara värd för en WCF-tjänst i en hanterad app
Om du vill vara värd för en tjänst i ett hanterat program bäddar du in koden för tjänsten i den hanterade programkoden, definierar en slutpunkt för tjänsten antingen imperativt i kod, deklarativt via konfiguration eller använder standardslutpunkter och skapar sedan en instans av ServiceHost.
Om du vill börja ta emot meddelanden anropar du Open på ServiceHost. Detta skapar och öppnar lyssnaren för tjänsten. Att vara värd för en tjänst på det här sättet kallas ofta "självvärd" eftersom det hanterade programmet gör själva värdarbetet. Om du vill stänga tjänsten anropar du CommunicationObject.CloseServiceHost.
En tjänst kan också finnas i en hanterad Windows-tjänst, i Internet Information Services (IIS) eller i Windows Process Activation Service (WAS). Mer information om värdalternativ för en tjänst finns i Värdtjänster.
Att vara värd för en tjänst i ett hanterat program är det mest flexibla alternativet eftersom det kräver minst infrastruktur för distribution. Mer information om att vara värd för tjänster i hanterade program finns i Hosting in a Managed Application (Värd i ett hanterat program).
Följande procedur visar hur du implementerar en lokalt installerad tjänst i ett konsolprogram.
Skapa en lokalt installerad tjänst
Skapa ett nytt konsolprogram:
Öppna Visual Studio och välj Nytt>projekt på Arkiv-menyn.
I listan Installerade mallar väljer du Visual C# eller Visual Basic och sedan Windows Desktop.
Välj mallen Konsolapp . Skriv
SelfHost
i rutan Namn och välj sedan OK.
Högerklicka på SelfHost i Solution Explorer och välj Lägg till referens. Välj System.ServiceModel på fliken .NET och välj sedan OK.
Dricks
Om Solution Explorer-fönstret inte visas väljer du Solution Explorer på menyn Visa .
Dubbelklicka på Program.cs eller Module1.vb i Solution Explorer för att öppna det i kodfönstret, om det inte redan är öppet. Lägg till följande instruktioner överst i filen:
using System.ServiceModel; using System.ServiceModel.Description;
Imports System.ServiceModel Imports System.ServiceModel.Description
Definiera och implementera ett tjänstkontrakt. Det här exemplet definierar en
HelloWorldService
som returnerar ett meddelande baserat på indata till tjänsten.[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
Kommentar
Mer information om hur du definierar och implementerar ett tjänstgränssnitt finns i Så här definierar du ett tjänstkontrakt och Hur du: Implementera ett tjänstkontrakt.
Överst i
Main
metoden skapar du en instans av Uri klassen med basadressen för tjänsten.Uri baseAddress = new Uri("http://localhost:8080/hello");
Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
Skapa en instans av ServiceHost klassen och skicka en Type som representerar tjänsttypen och basadressen Uniform Resource Identifier (URI) till ServiceHost(Type, Uri[]). Aktivera metadatapublicering och anropa Open sedan metoden på ServiceHost för att initiera tjänsten och förbereda den för att ta emot meddelanden.
// 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(); }
' 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
Kommentar
I det här exemplet används standardslutpunkter och ingen konfigurationsfil krävs för den här tjänsten. Om inga slutpunkter har konfigurerats skapar körningen en slutpunkt för varje basadress för varje tjänstkontrakt som implementeras av tjänsten. Mer information om standardslutpunkter finns i Förenklad konfiguration och förenklad konfiguration för WCF-tjänster.
Tryck på Ctrl+Skift+B för att skapa lösningen.
Testa tjänsten
Tryck på Ctrl+F5 för att köra tjänsten.
Öppna WCF-testklienten.
Dricks
Öppna WCF-testklienten genom att öppna Kommandotolken för utvecklare för Visual Studio och köra WcfTestClient.exe.
Välj Lägg till tjänst på Arkiv-menyn .
Skriv
http://localhost:8080/hello
i adressrutan och klicka på OK.Dricks
Kontrollera att tjänsten körs, annars misslyckas det här steget. Om du har ändrat basadressen i koden använder du den ändrade basadressen i det här steget.
Dubbelklicka på SayHello under noden Mina tjänstprojekt . Skriv ditt namn i kolumnen Värde i listan Begäran och klicka på Anropa.
Ett svarsmeddelande visas i svarslistan.
Exempel
I följande exempel skapas ett ServiceHost objekt som ska vara värd för en tjänst av typen HelloWorldService
och anropar sedan metoden på OpenServiceHost. En basadress anges i kod, metadatapublicering aktiveras och standardslutpunkter används.
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();
}
}
}
}
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
Se även
- Uri
- AppSettings
- ConfigurationManager
- Anvisningar: Värd för en WCF-tjänst i IIS
- Självvärd
- Värdtjänster
- Anvisningar: Definiera ett tjänstkontrakt
- Gör så här: Implementera ett tjänstkontrakt
- Verktyg för ServiceModel-metadataverktyg (Svcutil.exe)
- Använda bindningar för att konfigurera tjänster och klienter
- Bindningar som tillhandahålls av systemet