Postupy: Hostování služby WCF ve spravované aplikaci
Pokud chcete hostovat službu ve spravované aplikaci, vložte kód služby do kódu spravované aplikace, definujte koncový bod pro službu buď imperativním způsobem v kódu, deklarativní prostřednictvím konfigurace, nebo pomocí výchozích koncových bodů a pak vytvořte instanci ServiceHost.
Chcete-li začít přijímat zprávy, zavolejte Open .ServiceHost Tím se vytvoří a otevře naslouchací proces pro službu. Hostování služby tímto způsobem se často označuje jako "samoobslužné hostování", protože spravovaná aplikace provádí hostování samotnou práci. Chcete-li zavřít službu, zavolejte CommunicationObject.CloseServiceHost.
Službu je možné hostovat také ve spravované službě Windows, ve službě Internetová informační služba (IIS) nebo ve službě aktivace procesu systému Windows (WAS). Další informace o možnostech hostování pro službu naleznete v tématu Hostitelské služby.
Hostování služby ve spravované aplikaci je nejflexibilnější možností, protože k nasazení vyžaduje nejmenší infrastrukturu. Další informace o hostování služeb ve spravovaných aplikacích najdete v tématu Hostování ve spravované aplikaci.
Následující postup ukazuje, jak implementovat službu v místním prostředí v konzolové aplikaci.
Vytvoření služby v místním prostředí
Vytvořte novou konzolovou aplikaci:
Otevřete Visual Studio a v nabídce Soubor vyberte Nový>projekt.
V seznamu Nainstalované šablony vyberte Visual C# nebo Visual Basic a pak vyberte Plochu systému Windows.
Vyberte šablonu konzolové aplikace. Zadejte
SelfHost
do pole Název a pak zvolte OK.
Klikněte pravým tlačítkem na SelfHost v Průzkumník řešení a vyberte Přidat odkaz. Na kartě .NET vyberte System.ServiceModela pak zvolte OK.
Tip
Pokud není okno Průzkumník řešení viditelné, vyberte Průzkumník řešení z nabídky Zobrazení.
Poklikáním na Program.cs nebo Module1.vb v Průzkumník řešení ho otevřete v okně kódu, pokud ještě není otevřený. Na začátek souboru přidejte následující příkazy:
using System.ServiceModel; using System.ServiceModel.Description;
Imports System.ServiceModel Imports System.ServiceModel.Description
Definujte a implementujte kontrakt služby. Tento příklad definuje
HelloWorldService
zprávu, která vrátí zprávu na základě vstupu do služby.[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
Poznámka:
Další informace o definování a implementaci rozhraní služby naleznete v tématu Postupy: Definování kontraktu služby a postupy: Implementace kontraktu služby.
V horní části
Main
metody vytvořte instanci Uri třídy se základní adresou služby.Uri baseAddress = new Uri("http://localhost:8080/hello");
Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
Vytvořte instanci ServiceHost třídy, která předává Type typ služby a základní adresu Uniform Resource Identifier (URI) do ServiceHost(Type, Uri[])třídy . Povolte publikování metadat a potom zavolejte metodu OpenServiceHost pro inicializaci služby a připravte ji na příjem zpráv.
// 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
Poznámka:
Tento příklad používá výchozí koncové body a pro tuto službu není vyžadován žádný konfigurační soubor. Pokud nejsou nakonfigurované žádné koncové body, modul runtime vytvoří jeden koncový bod pro každou základní adresu pro každý kontrakt služby implementovaný službou. Další informace o výchozích koncových bodech naleznete v tématu Zjednodušená konfigurace a Zjednodušená konfigurace pro služby WCF.
Stisknutím kombinace kláves Ctrl+Shift+B sestavte řešení.
Testování služby
Stisknutím kláves Ctrl+F5 spusťte službu.
Otevřete testovacího klienta WCF.
Tip
Pokud chcete otevřít testovacího klienta WCF, otevřete vývojářský příkazový řádek pro Visual Studio a spusťte WcfTestClient.exe.
V nabídce Soubor vyberte Přidat službu.
Zadejte
http://localhost:8080/hello
do pole adresa a klepněte na tlačítko OK.Tip
Ujistěte se, že je služba spuštěná, nebo jinak tento krok selže. Pokud jste v kódu změnili základní adresu, použijte upravenou základní adresu v tomto kroku.
Poklikejte na SayHello pod uzlem Moje projekty služeb. Zadejte své jméno do sloupce Hodnota v seznamu Žádosti a klikněte na Vyvolat.
V seznamu odpovědí se zobrazí zpráva odpovědi .
Příklad
Následující příklad vytvoří ServiceHost objekt pro hostování služby typu HelloWorldService
a potom volá metodu Open .ServiceHost Základní adresa je k dispozici v kódu, publikování metadat je povolené a používají se výchozí koncové body.
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
Viz také
- Uri
- AppSettings
- ConfigurationManager
- Postupy: Hostování služby WCF v IIS
- Vlastní hostování
- Služby hostování
- Postupy: Definování kontraktu služby
- Postupy: Implementace kontraktu služby
- Nástroj metadat modelu služby (Svcutil.exe)
- Používání vazeb ke konfiguraci služeb a klientů
- Vazby poskytované systémem