Gewusst wie: Veröffentlichen von Metadaten für einen Dienst über den CodeHow to: Publish Metadata for a Service Using Code

Dies ist eines der beiden "Gewusst wie"-Themen, in denen erläutert wird, wie Sie Metadaten für einen Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)-Dienst veröffentlichen.This is one of two how-to topics that discuss publishing metadata for a Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) service. Es gibt zwei Möglichkeiten, wie ein Dienst Metadaten veröffentlichen kann: mit einer Konfigurationsdatei und mit Code.There are two ways to specify how a service should publish metadata, using a configuration file and using code. In diesem Thema wird das Veröffentlichen von Metadaten für einen Dienst mithilfe von Code dargestellt.This topic shows how to publish metadata for a service using a code.

Achtung

In diesem Thema wird das Veröffentlichen von Metadaten auf unsichere Weise dargestellt.This topic shows how to publish metadata in an unsecure manner. Jeder Client kann Metadaten vom Dienst abrufen.Any client can retrieve the metadata from the service. Informationen zum sicheren Veröffentlichen von Metadaten für einen DienstIf you require your service to publish metadata in a secure manner. finden Sie unter benutzerdefinierter sicherer Metadatenendpunkt.see Custom Secure Metadata Endpoint.

Weitere Informationen finden Sie unterFor more information aboutVeröffentlichen von Metadaten in einer Konfigurationsdatei finden Sie unter Vorgehensweise: Veröffentlichen von Metadaten für einen Dienst mithilfe einer Konfigurationsdatei. publishing metadata in a configuration file, see How to: Publish Metadata for a Service Using a Configuration File. Die Veröffentlichung von Metadaten ermöglicht Clients, Metadaten über eine WS-Transfer-GET-Anforderung oder eine HTTP/GET-Anforderung mithilfe einer ?wsdl-Abfragezeichenfolge abzurufen.Publishing metadata allows clients to retrieve the metadata using a WS-Transfer GET request or an HTTP/GET request using the ?wsdl query string. Erstellen Sie einen grundlegenden WCF-Dienst, um sicherzustellen, dass der Code funktioniert.To be sure that the code is working you must create a basic WCF service. Im folgenden Code wird ein grundlegender, selbst gehosteter Dienst bereitgestellt:A basic self-hosted service is provided in the following code.

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

So veröffentlichen Sie Metadaten im CodeTo publish metadata in code

  1. Instanziieren Sie in der Hauptmethode einer Konsolenanwendung ein ServiceHost-Objekt, indem Sie den Diensttyp und die Basisadresse übergeben.Within the main method of a console application, instantiate a ServiceHost object by passing in the service type and the base address.

    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. Erstellen Sie unmittelbar unter dem Code für Schritt 1 einen try-Block, um alle Ausnahmen abzufangen, die während der Ausführung des Diensts ausgelöst werden.Create a try block immediately below the code for step 1, this catches any exceptions that get thrown while the service is running.

    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. Überprüfen Sie, ob der Diensthost bereits ein ServiceMetadataBehavior enthält. Ist dies nicht der Fall, erstellen Sie eine neue ServiceMetadataBehavior-Instanz.Check to see whether the service host already contains a ServiceMetadataBehavior, if not, create a new ServiceMetadataBehavior instance.

    // 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. Legen Sie die HttpGetEnabled-Eigenschaft auf true. fest.Set the HttpGetEnabled property to true.

    smb.HttpGetEnabled = true;
    
    smb.HttpGetEnabled = True
    
  5. Das ServiceMetadataBehavior-Objekt enthält die MetadataExporter-Eigenschaft.The ServiceMetadataBehavior contains a MetadataExporter property. Das MetadataExporter-Objekt enthält die PolicyVersion-Eigenschaft.The MetadataExporter contains a PolicyVersion property. Legen Sie den Wert der PolicyVersion-Eigenschaft auf Policy15 fest.Set the value of the PolicyVersion property to Policy15. Die PolicyVersion-Eigenschaft kann auch auf Policy12 festgelegt werden.The PolicyVersion property can also be set to Policy12. Bei Festlegung auf Policy15 das metadatenexportprogramm Richtlinieninformationen mit Metadaten, die "WS-Policy 1.5 entspricht.When set to Policy15 the metadata exporter generates policy information with the metadata that" conforms to WS-Policy 1.5. Nach dem Festlegen auf Policy12 erstellt das Metadatenexportprogramm Richtlinieninformationen gemäß der WS-Richtlinie 1.2.When set to Policy12 the metadata exporter generates policy information that conforms to WS-Policy 1.2.

    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
    
    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
    
  6. Fügen Sie die ServiceMetadataBehavior-Instanz der Verhaltensauflistung des Diensthosts hinzu.Add the ServiceMetadataBehavior instance to the service host's behaviors collection.

    svcHost.Description.Behaviors.Add(smb);
    
    svcHost.Description.Behaviors.Add(smb)
    
  7. Fügen Sie dem Diensthost den Endpunkt für den Metadatenaustausch hinzu.Add the metadata exchange endpoint to the service host.

    // Add MEX endpoint
    svcHost.AddServiceEndpoint(
      ServiceMetadataBehavior.MexContractName,
      MetadataExchangeBindings.CreateMexHttpBinding(),
      "mex"
    );
    
    'Add MEX endpoint
    svcHost.AddServiceEndpoint( _
          ServiceMetadataBehavior.MexContractName, _
          MetadataExchangeBindings.CreateMexHttpBinding(), _
          "mex")
    
  8. Fügen Sie dem Diensthost einen Anwendungsendpunkt hinzu.Add an application endpoint to the service host.

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

    Hinweis

    Wenn Sie dem Dienst keine Endpunkte hinzufügen, werden von der Runtime automatisch Standardendpunkte hinzugefügt.If you do not add any endpoints to the service, the runtime adds default endpoints for you. Da in diesem Beispiel das ServiceMetadataBehavior des Diensts auf true festgelegt ist, ist für den Dienst die Veröffentlichung von Metadaten aktiviert.In this example, because the service has a ServiceMetadataBehavior set to true, the service has publishing metadata enabled. Weitere Informationen finden Sie unterFor more information aboutStandardendpunkte, finden Sie unter vereinfachte Konfiguration und vereinfachte Konfiguration für WCF-Dienste. default endpoints, see Simplified Configuration and Simplified Configuration for WCF Services.

  9. Öffnen Sie den Diensthost, und warten Sie auf eingehende Aufrufe.Open the service host and wait for incoming calls. Schließen Sie den Diensthost, wenn der Benutzer die Eingabetaste drückt.When the user presses ENTER, close the service host.

    // 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. Erstellen Sie die Konsolenanwendung und führen Sie sie aus.Build and run the console application.

  11. Rufen Sie mithilfe des Internet Explorers die Basisadresse des Diensts auf (in diesem Beispiel http://localhost:8001/MetadataSample), und stellen Sie sicher, dass die Metadatenveröffentlichung aktiviert ist.Use Internet Explorer to browse to the base address of the service (http://localhost:8001/MetadataSample in this sample) and verify that the metadata publishing is turned on. Es sollte eine Webseite angezeigt werden, die am oberen Rand den Text "Einfacher Dienst" und unmittelbar darunter den Text "Sie haben einen Dienst erstellt" enthält.You should see a Web page displayed that says "Simple Service" at the top and immediately below "You have created a service." Wenn nicht, wird oben auf der Ergebnisseite folgende Meldung angezeigt: "Das Veröffentlichen von Metadaten für diesen Dienst ist derzeit deaktiviert."If not, a message at the top of the resulting page displays: "Metadata publishing for this service is currently disabled."

BeispielExample

Im folgenden Codebeispiel wird die Implementierung eines einfachen WCFWCF-Diensts veranschaulicht, der Metadaten für diesen Dienst im Code veröffentlicht.The following code example shows the implementation of a basic WCFWCF service that publishes metadata for the service in code.

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

Siehe auchSee Also

Vorgehensweise Hosten eines WCF-Diensts in einer verwalteten AnwendungHow to: Host a WCF Service in a Managed Application
Selbst gehostete DiensteSelf-Host
Übersicht über die MetadatenarchitekturMetadata Architecture Overview
Verwenden von MetadatenUsing Metadata
Vorgehensweise: Veröffentlichen von Metadaten für einen Dienst mithilfe einer KonfigurationsdateiHow to: Publish Metadata for a Service Using a Configuration File