Megosztás a következőn keresztül:


Útmutató: WCF-szolgáltatás üzemeltetése felügyelt alkalmazásban

Ha egy felügyelt alkalmazáson belül szeretne szolgáltatást üzemeltetni, ágyazza be a szolgáltatás kódját a felügyelt alkalmazás kódjába, definiáljon egy végpontot a szolgáltatáshoz vagy imperatívan kódban, deklaratív módon konfigurációval, vagy alapértelmezett végpontok használatával, majd hozzon létre egy példányt ServiceHost.

Az üzenetek fogadásának megkezdéséhez hívja fel a következőt OpenServiceHost: . Ezzel létrehozza és megnyitja a szolgáltatás figyelőit. A szolgáltatás ily módon történő üzemeltetését gyakran "önkiszolgálónak" is nevezik, mivel a felügyelt alkalmazás maga végzi az üzemeltetést. A szolgáltatás bezárásához hívja fel a következőt CommunicationObject.CloseServiceHost: .

Egy szolgáltatás üzemeltethető felügyelt Windows-szolgáltatásban, az Internet Information Servicesben (IIS) vagy a Windows Folyamataktiválási szolgáltatásban (WAS). A szolgáltatás üzemeltetési lehetőségeiről további információt a Hosting Services című témakörben talál.

A felügyelt alkalmazásokban a szolgáltatás üzemeltetése a legrugalmasabb megoldás, mivel a legkisebb infrastruktúrát kell üzembe helyeznie. A felügyelt alkalmazások szolgáltatásainak üzemeltetéséről további információt a Felügyelt alkalmazásokban való üzemeltetés című témakörben talál.

Az alábbi eljárás bemutatja, hogyan implementálhat egy saját üzemeltetésű szolgáltatást egy konzolalkalmazásban.

Saját üzemeltetésű szolgáltatás létrehozása

  1. Hozzon létre egy új konzolalkalmazást:

    1. Nyissa meg a Visual Studiót, és válassza az Új>projekt lehetőséget a Fájl menüben.

    2. A Telepített sablonok listában válassza a Visual C# vagy a Visual Basic, majd a Windows Desktop lehetőséget.

    3. Válassza ki a Konzolalkalmazás sablont. Írja be SelfHost a Név mezőbe, majd kattintson az OK gombra.

  2. Kattintson a jobb gombbal a SelfHost elemre Megoldáskezelő, és válassza a Hivatkozás hozzáadása lehetőséget. Válassza a System.ServiceModel elemet a .NET lapon, majd kattintson az OK gombra.

    Tipp.

    Ha a Megoldáskezelő ablak nem látható, válassza Megoldáskezelőa Nézet menüből.

  3. Kattintson duplán Program.cs vagy Module1.vbMegoldáskezelő a kódablakban való megnyitásához, ha még nincs megnyitva. Adja hozzá a következő utasításokat a fájl tetején:

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  4. Szolgáltatási szerződés definiálása és megvalósítása. Ez a példa egy HelloWorldService olyan üzenetet határoz meg, amely a szolgáltatás bemenete alapján ad vissza egy üzenetet.

    [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
    

    Feljegyzés

    A szolgáltatási felület meghatározásával és implementálásával kapcsolatos további információkért lásd : Hogyan: Szolgáltatásszerződés definiálása és hogyan: Szolgáltatásszerződés megvalósítása.

  5. A metódus tetején Main hozza létre az Uri osztály egy példányát a szolgáltatás alapcímével.

    Uri baseAddress = new Uri("http://localhost:8080/hello");
    
    Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
    
  6. Hozzon létre egy példányt az ServiceHost osztályból, amely a Type szolgáltatástípust és az egységes erőforrás-azonosító (URI) alapcímet jelöli a ServiceHost(Type, Uri[]). Engedélyezze a metaadatok közzétételét, majd hívja meg a Open metódust a ServiceHost szolgáltatás inicializálásához és az üzenetek fogadásához való előkészítéséhez.

    // 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
    

    Feljegyzés

    Ez a példa alapértelmezett végpontokat használ, és ehhez a szolgáltatáshoz nincs szükség konfigurációs fájlra. Ha nincsenek végpontok konfigurálva, akkor a futtatókörnyezet minden egyes szolgáltatásszerződéshez létrehoz egy végpontot a szolgáltatás által megvalósított minden egyes szolgáltatási szerződéshez. Az alapértelmezett végpontokról további információt a WCF-szolgáltatások egyszerűsített konfigurációja és egyszerűsített konfigurációja című témakörben talál.

  7. A megoldás létrehozásához nyomja le a Ctrl Shift+B billentyűkombinációt.+

Szolgáltatás tesztelése

  1. A szolgáltatás futtatásához nyomja le a Ctrl F5 billentyűkombinációt+.

  2. Nyissa meg a WCF tesztügyfélt.

    Tipp.

    A WCF-tesztügyfél megnyitásához nyissa meg a Visual Studio fejlesztői parancssorát, és hajtsa végre a WcfTestClient.exe.

  3. Válassza a Fájl menü Szolgáltatás hozzáadása elemét.

  4. Írja be http://localhost:8080/hello a címmezőbe, és kattintson az OK gombra.

    Tipp.

    Győződjön meg arról, hogy a szolgáltatás fut, különben ez a lépés meghiúsul. Ha módosította az alapcímet a kódban, használja a módosított alapcímet ebben a lépésben.

  5. Kattintson duplán a SayHello elemre a Saját szolgáltatásprojektek csomópont alatt. Írja be a nevét a Kérelem lista Érték oszlopába, és kattintson a Meghívás gombra.

    Megjelenik egy válaszüzenet a Válasz listában.

Példa

Az alábbi példa létrehoz egy objektumot ServiceHost egy típusú HelloWorldServiceszolgáltatás üzemeltetéséhez, majd meghívja a Open metódust ServiceHost. A kód egy alapcímet ad meg, a metaadat-közzététel engedélyezve van, és az alapértelmezett végpontokat használja.

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

Lásd még