Delen via


Procedure: Metagegevens voor een service publiceren met behulp van code

Dit is een van de twee onderwerpen over het publiceren van metagegevens voor een WCF-service (Windows Communication Foundation). Er zijn twee manieren om op te geven hoe een service metagegevens moet publiceren, met behulp van een configuratiebestand en code. In dit onderwerp wordt beschreven hoe u metagegevens voor een service publiceert met behulp van een code.

Let op

In dit onderwerp wordt beschreven hoe u metagegevens op een onbeveiligde manier publiceert. Elke client kan de metagegevens ophalen uit de service. Als u wilt dat uw service metagegevens op een veilige manier publiceert. zie aangepast eindpunt voor beveiligde metagegevens.

Zie Voor meer informatie over het publiceren van metagegevens in een configuratiebestand : Metagegevens voor een service publiceren met behulp van een configuratiebestand. Door metagegevens te publiceren, kunnen clients de metagegevens ophalen met behulp van een WS-Transfer GET-aanvraag of een HTTP/GET-aanvraag met behulp van de ?wsdl querytekenreeks. Om ervoor te zorgen dat de code werkt, moet u een eenvoudige WCF-service maken. De volgende code bevat een eenvoudige zelf-hostende service.

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

Metagegevens publiceren in code

  1. Binnen de hoofdmethode van een consoletoepassing instantieert u een ServiceHost object door het servicetype en het basisadres door te geven.

    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. Maak een try-blok direct onder de code voor stap 1. Hiermee worden eventuele uitzonderingen onderschept die worden gegenereerd terwijl de service wordt uitgevoerd.

    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. Controleer of de servicehost al een ServiceMetadataBehavior, indien niet, een nieuw ServiceMetadataBehavior exemplaar bevat.

    // 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. Stel de HttpGetEnabled eigenschap in op true.

    smb.HttpGetEnabled = true;
    
    smb.HttpGetEnabled = True
    
  5. De ServiceMetadataBehavior bevat een MetadataExporter eigenschap. De MetadataExporter bevat een PolicyVersion eigenschap. Stel de waarde van de PolicyVersion eigenschap in op Policy15. De PolicyVersion eigenschap kan ook worden ingesteld op Policy12. Wanneer deze is ingesteld op Policy15 de metagegevensexporteur, worden beleidsinformatie gegenereerd met de metagegevens die voldoen aan WS-Policy 1.5. Wanneer deze is ingesteld op Policy12 de metagegevensexporteur, worden beleidsinformatie gegenereerd die voldoet aan WS-Policy 1.2.

    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
    
    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
    
  6. Voeg het ServiceMetadataBehavior exemplaar toe aan de verzameling gedrag van de servicehost.

    svcHost.Description.Behaviors.Add(smb);
    
    svcHost.Description.Behaviors.Add(smb)
    
  7. Voeg het eindpunt voor metagegevensuitwisseling toe aan de servicehost.

    // Add MEX endpoint
    svcHost.AddServiceEndpoint(
      ServiceMetadataBehavior.MexContractName,
      MetadataExchangeBindings.CreateMexHttpBinding(),
      "mex"
    );
    
    'Add MEX endpoint
    svcHost.AddServiceEndpoint( _
          ServiceMetadataBehavior.MexContractName, _
          MetadataExchangeBindings.CreateMexHttpBinding(), _
          "mex")
    
  8. Voeg een toepassingseindpunt toe aan de servicehost.

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

    Notitie

    Als u geen eindpunten aan de service toevoegt, voegt de runtime standaardeindpunten voor u toe. In dit voorbeeld, omdat de service een ServiceMetadataBehavior set heeft, trueis publicatiemetagegevens ingeschakeld voor de service. Zie Vereenvoudigde configuratie en vereenvoudigde configuratie voor WCF-services voor meer informatie over standaardeindpunten.

  9. Open de servicehost en wacht op binnenkomende oproepen. Wanneer de gebruiker op Enter drukt, sluit u de servicehost.

    // 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. Bouw en voer de consoletoepassing uit.

  11. Blader naar het basisadres van de service (http://localhost:8001/MetadataSample in dit voorbeeld) en controleer of het publiceren van metagegevens is ingeschakeld. Er wordt een webpagina weergegeven met de tekst 'Eenvoudige service' bovenaan en direct onder 'U hebt een service gemaakt'. Zo niet, dan wordt boven aan de resulterende pagina het volgende bericht weergegeven: 'Publicatie van metagegevens voor deze service is momenteel uitgeschakeld'.

Opmerking

In het volgende codevoorbeeld ziet u de implementatie van een eenvoudige WCF-service waarmee metagegevens voor de service in code worden gepubliceerd.

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

Zie ook