Sdílet prostřednictvím


Postupy: Publikování metadat služby promocí kódu

Toto je jedno ze dvou témat s postupy, která diskutují o publikování metadat pro službu WCF (Windows Communication Foundation). Existují dva způsoby, jak určit, jak má služba publikovat metadata, pomocí konfiguračního souboru a pomocí kódu. Toto téma ukazuje, jak publikovat metadata pro službu pomocí kódu.

Upozornění

Toto téma ukazuje, jak publikovat metadata nezabezpečeným způsobem. Každý klient může načíst metadata ze služby. Pokud potřebujete, aby služba bezpečně publikovala metadata. Viz vlastní koncový bod zabezpečených metadat.

Další informace o publikování metadat v konfiguračním souboru naleznete v tématu Postupy: Publikování metadat pro službu pomocí konfiguračního souboru. Metadata publikování umožňují klientům načíst metadata pomocí požadavku WS-Transfer GET nebo požadavku HTTP/GET pomocí ?wsdl řetězce dotazu. Abyste měli jistotu, že kód funguje, musíte vytvořit základní službu WCF. Základní služba v místním prostředí je poskytována v následujícím kódu.

using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Metadata.Samples
{
    [ServiceContract]
    public interface ISimpleService
    {
        [OperationContract]
        string SimpleMethod(string msg);
    }

    class SimpleService : ISimpleService
    {
        public string SimpleMethod(string msg)
        {
            Console.WriteLine("The caller passed in " + msg);
            return "Hello " + msg;
        }
    }
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.ServiceModel.Description

<ServiceContract()> _
Public Interface ISimpleService
    <OperationContract()> _
    Function SimpleMethod(ByVal msg As String) As String
End Interface

Class SimpleService
    Implements ISimpleService

    Public Function SimpleMethod(ByVal msg As String) As String Implements ISimpleService.SimpleMethod
        Console.WriteLine("The caller passed in " + msg)
        Return "Hello " + msg
    End Function
End Class

Publikování metadat v kódu

  1. V rámci hlavní metody konzolové aplikace vytvořte instanci ServiceHost objektu předáním typu služby a základní adresy.

    ServiceHost svcHost = new ServiceHost(typeof(SimpleService), new Uri("http://localhost:8001/MetadataSample"));
    
    Dim svcHost As New ServiceHost(GetType(SimpleService), New Uri("http://localhost:8001/MetadataSample"))
    
  2. Vytvořte blok try bezprostředně pod kódem pro krok 1. Tím se zachytí všechny výjimky, které se při spuštění služby vyvolá.

    try
    {
    
    Try
    
    }
    catch (CommunicationException commProblem)
    {
        Console.WriteLine("There was a communication problem. " + commProblem.Message);
        Console.Read();
    }
    
    Catch commProblem As CommunicationException
    
        Console.WriteLine("There was a communication problem. " + commProblem.Message)
        Console.Read()
    End Try
    
  3. Zkontrolujte, jestli hostitel služby již obsahuje ServiceMetadataBehaviorinstanci , pokud ne, vytvořte novou ServiceMetadataBehavior instanci.

    // Check to see if the service host already has a ServiceMetadataBehavior
    ServiceMetadataBehavior smb = svcHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
    // If not, add one
    if (smb == null)
        smb = new ServiceMetadataBehavior();
    
    'Check to see if the service host already has a ServiceMetadataBehavior
    Dim smb As ServiceMetadataBehavior = svcHost.Description.Behaviors.Find(Of ServiceMetadataBehavior)()
    'If not, add one
    If (smb Is Nothing) Then
        smb = New ServiceMetadataBehavior()
    End If
    
  4. Nastavení vlastnosti na HttpGetEnabledtrue.

    smb.HttpGetEnabled = true;
    
    smb.HttpGetEnabled = True
    
  5. MetadataExporter Obsahuje ServiceMetadataBehavior vlastnost. PolicyVersion Obsahuje MetadataExporter vlastnost. Nastavte hodnotu PolicyVersion vlastnosti na Policy15hodnotu . Vlastnost PolicyVersion lze také nastavit na Policy12hodnotu . Při nastavení na Policy15 exportér metadat generuje informace o zásadách s metadaty, která odpovídají WS-Policy 1.5. Při nastavení na Policy12 exportér metadat generuje informace o zásadách, které odpovídají WS-Policy 1.2.

    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
    
    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
    
  6. ServiceMetadataBehavior Přidejte instanci do kolekce chování hostitele služby.

    svcHost.Description.Behaviors.Add(smb);
    
    svcHost.Description.Behaviors.Add(smb)
    
  7. Přidejte koncový bod výměny metadat do hostitele služby.

    // Add MEX endpoint
    svcHost.AddServiceEndpoint(
      ServiceMetadataBehavior.MexContractName,
      MetadataExchangeBindings.CreateMexHttpBinding(),
      "mex"
    );
    
    'Add MEX endpoint
    svcHost.AddServiceEndpoint( _
          ServiceMetadataBehavior.MexContractName, _
          MetadataExchangeBindings.CreateMexHttpBinding(), _
          "mex")
    
  8. Přidejte koncový bod aplikace do hostitele služby.

    // Add application endpoint
    svcHost.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
    
    'Add application endpoint
    svcHost.AddServiceEndpoint(GetType(ISimpleService), New WSHttpBinding(), "")
    

    Poznámka:

    Pokud do služby nepřidáte žádné koncové body, modul runtime za vás přidá výchozí koncové body. V tomto příkladu, protože služba má nastavenou ServiceMetadataBehavior hodnotu true, má služba povolená metadata publikování. Další informace o výchozích koncových bodech naleznete v tématu Zjednodušená konfigurace a Zjednodušená konfigurace pro služby WCF.

  9. Otevřete hostitele služby a počkejte na příchozí hovory. Když uživatel stiskne klávesu ENTER, zavřete hostitele služby.

    // Open the service host to accept incoming calls
    svcHost.Open();
    
    // The service can now be accessed.
    Console.WriteLine("The service is ready.");
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.WriteLine();
    Console.ReadLine();
    
    // Close the ServiceHostBase to shutdown the service.
    svcHost.Close();
    
    'Open the service host to accept incoming calls
    svcHost.Open()
    
    'The service can now be accessed.
    Console.WriteLine("The service is ready.")
    Console.WriteLine("Press <ENTER> to terminate service.")
    Console.WriteLine()
    Console.ReadLine()
    
    'Close the ServiceHostBase to shutdown the service.
    svcHost.Close()
    
  10. Vytvořte a spusťte konzolovou aplikaci.

  11. Přejděte na základní adresu služby (http://localhost:8001/MetadataSample v této ukázce) a ověřte, že je publikování metadat zapnuté. Měla by se zobrazit webová stránka s textem "Jednoduchá služba" v horní části a hned pod textem "Vytvořili jste službu". Pokud ne, zobrazí se v horní části výsledné stránky zpráva: "Publikování metadat pro tuto službu je aktuálně zakázáno".

Příklad

Následující příklad kódu ukazuje implementaci základní služby WCF, která publikuje metadata pro službu v kódu.

using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Metadata.Samples
{
    [ServiceContract]
    public interface ISimpleService
    {
        [OperationContract]
        string SimpleMethod(string msg);
    }

    class SimpleService : ISimpleService
    {
        public string SimpleMethod(string msg)
        {
            Console.WriteLine("The caller passed in " + msg);
            return "Hello " + msg;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost svcHost = new ServiceHost(typeof(SimpleService), new Uri("http://localhost:8001/MetadataSample"));
            try
            {
                // Check to see if the service host already has a ServiceMetadataBehavior
                ServiceMetadataBehavior smb = svcHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
                // If not, add one
                if (smb == null)
                    smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                svcHost.Description.Behaviors.Add(smb);
                // Add MEX endpoint
                svcHost.AddServiceEndpoint(
                  ServiceMetadataBehavior.MexContractName,
                  MetadataExchangeBindings.CreateMexHttpBinding(),
                  "mex"
                );
                // Add application endpoint
                svcHost.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
                // Open the service host to accept incoming calls
                svcHost.Open();

                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                svcHost.Close();
            }
            catch (CommunicationException commProblem)
            {
                Console.WriteLine("There was a communication problem. " + commProblem.Message);
                Console.Read();
            }
        }
    }
}
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.ServiceModel.Description

<ServiceContract()> _
Public Interface ISimpleService
    <OperationContract()> _
    Function SimpleMethod(ByVal msg As String) As String
End Interface

Class SimpleService
    Implements ISimpleService

    Public Function SimpleMethod(ByVal msg As String) As String Implements ISimpleService.SimpleMethod
        Console.WriteLine("The caller passed in " + msg)
        Return "Hello " + msg
    End Function
End Class

Module Module1

    Sub Main()
        Dim svcHost As New ServiceHost(GetType(SimpleService), New Uri("http://localhost:8001/MetadataSample"))
        Try
            'Check to see if the service host already has a ServiceMetadataBehavior
            Dim smb As ServiceMetadataBehavior = svcHost.Description.Behaviors.Find(Of ServiceMetadataBehavior)()
            'If not, add one
            If (smb Is Nothing) Then
                smb = New ServiceMetadataBehavior()
            End If
            smb.HttpGetEnabled = True
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
            svcHost.Description.Behaviors.Add(smb)
            'Add MEX endpoint
            svcHost.AddServiceEndpoint( _
                  ServiceMetadataBehavior.MexContractName, _
                  MetadataExchangeBindings.CreateMexHttpBinding(), _
                  "mex")
            'Add application endpoint
            svcHost.AddServiceEndpoint(GetType(ISimpleService), New WSHttpBinding(), "")
            'Open the service host to accept incoming calls
            svcHost.Open()

            'The service can now be accessed.
            Console.WriteLine("The service is ready.")
            Console.WriteLine("Press <ENTER> to terminate service.")
            Console.WriteLine()
            Console.ReadLine()

            'Close the ServiceHostBase to shutdown the service.
            svcHost.Close()
        Catch commProblem As CommunicationException

            Console.WriteLine("There was a communication problem. " + commProblem.Message)
            Console.Read()
        End Try
    End Sub
End Module

Viz také