Gewusst wie: Veröffentlichen von Metadaten für einen Dienst mithilfe einer KonfigurationsdateiHow to: Publish Metadata for a Service Using a Configuration File

Dies ist eine von zwei Themen Veröffentlichen von Metadaten für einen Windows Communication Foundation (WCF)-Dienst.This is one of two how-to topics that demonstrate publishing metadata for a 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 einer Konfigurationsdatei dargestellt.This topic shows how to publish metadata for a service using a configuration file.

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. Wenn Sie den Dienst zum Veröffentlichen von Metadaten auf sichere Weise benötigen, finden Sie unter benutzerdefinierter sicherer Metadatenendpunkt.If you require your service to publish metadata in a secure manner, see Custom Secure Metadata Endpoint.

Weitere Informationen zum Veröffentlichen von Metadaten im Code finden Sie unter Vorgehensweise: Veröffentlichen von Metadaten für einen Dienst mithilfe von Code.For more information about publishing metadata in code, see How to: Publish Metadata for a Service Using Code. 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. Um sicherzustellen, dass der Code ausgeführt wird, erstellen Sie einen grundlegenden WCF-Dienst.To be sure that the code is working, create a basic WCF service. Der Einfachheit halber wird im folgenden Code ein grundlegender, selbst gehosteter Dienst bereitgestellt.For simplicity, 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;  
        }  
    }  

    class Program  
    {  
        static void Main(string[] args)  
        {  
            ServiceHost host = new ServiceHost(typeof(SimpleService),  
                new Uri("http://localhost:8001/MetadataSample"));   
            try  
            {  
                // Open the service host to accept incoming calls  
                host.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.  
                host.Close();  
            }  
            catch (CommunicationException commProblem)  
            {  
                Console.WriteLine("There was a communication problem. " + commProblem.Message);  
                Console.Read();  
            }  
        }  
    }  
}  

Dieser Dienst ist ein selbst gehosteter Dienst, der mit einer Konfigurationsdatei konfiguriert wird.This service is a self-hosted service, which is configured using a configuration file. Die folgende Konfigurationsdatei dient als Ausgangspunkt.The following configuration file serves as a starting point.

<configuration>  
  <system.serviceModel>  
    <services>  
      <service name="Metadata.Example.SimpleService">  
        <endpoint address=""  
                  binding="basicHttpBinding"  
                  contract="Metadata.Example.ISimpleService" />  
      </service>  
    </services>  
    <behaviors>  

    </behaviors>  
  </system.serviceModel>  
</configuration>  

So veröffentlichen Sie Metadaten für einen WCF-Dienst mithilfe einer KonfigurationsdateiTo publish metadata for a WCF service using an application configuration file

  1. Erstellen Sie in der App.config-Datei, nachdem Sie das </services>-Element geschlossen haben, ein <behaviors>-Element.Within the App.config file, after the closing </services> element, create a <behaviors> element.

  2. Fügen Sie im <behaviors>-Element ein <serviceBehaviors>-Element hinzu.Within the <behaviors> element, add a <serviceBehaviors> element.

  3. Fügen Sie ein <behavior>-Element zum <serviceBehaviors>-Element hinzu, und geben Sie einen Wert für das name-Attribut des <behavior>-Elements an.Add a <behavior> element to the <serviceBehaviors> element and specify a value for the name attribute of the <behavior> element.

  4. Fügen Sie dem <serviceMetadata>-Element ein <behavior>-Element hinzu.Add a <serviceMetadata> element to the <behavior> element. Legen Sie das httpGetEnabled-Attribut auf true und das policyVersion-Attribut auf Policy15 fest.Set the httpGetEnabled attribute to true and the policyVersion attribute to Policy15. httpGetEnabled ermöglicht es dem Dienst, auf die Metadatenanforderungen einer HTTP GET-Anforderung zu antworten.httpGetEnabled allows the service to respond to metadata requests made by an HTTP GET request. policyVersion teilt dem Dienst mit, bei der Erstellung von Metadaten der WS-Richtlinie 1.5 zu folgen.policyVersion tells the service to conform to WS-Policy 1.5 when generating metadata.

  5. Fügen Sie dem behaviorConfiguration-Element ein <service>-Attribut hinzu, und geben Sie das name-Attribut des in Schritt 1 hinzugefügten <behavior>-Elements an, wie im folgenden Codebeispiel gezeigt.Add a behaviorConfiguration attribute to the <service> element and specify the name attribute of the <behavior> element added in step 1, as shown in the following code example.

    <services>  
      <service  
          name="Metadata.Example.SimpleService"  
          behaviorConfiguration="SimpleServiceBehavior">  
        ...  
      </service>  
    </services>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="SimpleServiceBehavior">  
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    
  6. Fügen Sie ein oder mehrere <endpoint>-Elemente hinzu, wobei der Vertrag auf IMetadataExchange festgelegt ist, wie im folgenden Codebeispiel gezeigt.Add one or more <endpoint> elements with the contract set to IMetadataExchange, as shown in the following code example.

    <services>  
      <service  
          name="Metadata.Example.SimpleService"  
          behaviorConfiguration="SimpleServiceBehavior">  
    
        <endpoint address=""  
                  binding="wsHttpBinding"  
                  contract="Metadata.Example.ISimpleService" />  
    
        <endpoint address="mex"  
                  binding="mexHttpBinding"  
                  contract="IMetadataExchange" />  
      </service>  
    </services>  
    
  7. Legen Sie für die im vorherigen Schritt hinzugefügten Metadatenendpunkte das binding-Attribut auf einen der folgenden Werte fest:For the metadata endpoints added in the previous step, set the binding attribute to one of the following:

    • mexHttpBinding für HTTP-Veröffentlichung.mexHttpBinding for HTTP publication.

    • mexHttpsBinding für HTTPS-Veröffentlichung.mexHttpsBinding for HTTPS publication.

    • mexNamedPipeBinding für benannte Pipeveröffentlichung.mexNamedPipeBinding for named pipe publication.

    • mexTcpBinding für TCP-Veröffentlichung.mexTcpBinding for TCP publication.

  8. Legen Sie die Adressen für die in einem vorherigen Schritt hinzugefügten Metadatenendpunkte auf Folgendes fest:For the metadata endpoints added in a previous step, set the address equal to:

    • Eine leere Zeichenfolge, um die Basisadresse der Hostanwendung als Veröffentlichungspunkt zu verwenden, wenn die Basisadresse gleich der Metadatenbindung ist.An empty string to use the host application's base address as the publication point if the base address is the same as the metadata binding.

    • Eine relative Adresse, wenn die Hostanwendung über eine Basisadresse verfügt.A relative address if the host application has a base address.

    • Eine absolute Adresse.An absolute address.

  9. Erstellen Sie die Konsolenanwendung und führen Sie sie aus.Build and run the console application.

  10. Verwenden Sie Internet Explorer, um die Basisadresse des Diensts zu suchen (http://localhost:8001/MetadataSample in diesem Beispiel) 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. 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."

So verwenden Sie StandardendpunkteTo use default endpoints

  1. Um Metadaten für einen Dienst zu konfigurieren, der Standardendpunkte verwendet, geben Sie das ServiceMetadataBehavior in der Konfigurationsdatei fest, so wie im vorherigen Beispiel. Legen Sie jedoch keine Endpunkte fest.To configure metadata on a service that uses default endpoints, specify the ServiceMetadataBehavior in the configuration file as in the previous example, but do not specify any endpoints. Die Konfigurationsdatei sieht dann wie folgt aus.The configuration file would then look like this.

    <configuration>  
      <system.serviceModel>  
        <behaviors>  
          <serviceBehaviors>  
            <behavior name="SimpleServiceBehavior">  
              <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />  
            </behavior>  
          </serviceBehaviors>  
        </behaviors>  
    
      </system.serviceModel>  
    </configuration>  
    

    Da für den Dienst das ServiceMetadataBehavior mit httpGetEnabled auf true festgelegt wurde, ist für den Dienst die Veröffentlichung von Metadaten aktiviert. Und da keine Endpunkte explizit hinzugefügt wurden, fügt die Runtime die Standardendpunkte hinzu.Because the service has a ServiceMetadataBehavior with the httpGetEnabled set to true, the service has publishing metadata enabled, and because no endpoints were explicitly added, the runtime adds the default endpoints. Weitere Informationen zu Standardendpunkten, Bindungen und Verhaltensweisen finden Sie unter vereinfachte Konfiguration und vereinfachte Konfiguration für WCF-Dienste.For more information about default endpoints, bindings, and behaviors, see Simplified Configuration and Simplified Configuration for WCF Services.

BeispielExample

Das folgende Codebeispiel zeigt die Implementierung der grundlegenden WCF-Dienst und die Konfigurationsdatei, die Metadaten für den Dienst veröffentlicht.The following code example shows the implementation of a basic WCF service and the configuration file that publishes metadata for the 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;  
        }  
    }  

    class Program  
    {  
        static void Main(string[] args)  
        {  
            ServiceHost host = new ServiceHost(typeof(SimpleService),  
                new Uri("http://localhost:8001/MetadataSample"));   
            try  
            {  
                // Open the service host to accept incoming calls  
                host.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.  
                host.Close();  
            }  
            catch (CommunicationException commProblem)  
            {  
                Console.WriteLine("There was a communication problem. " + commProblem.Message);  
                Console.Read();  
            }  
        }  
    }  
}  
<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="SimpleServiceBehavior">  
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />  
          <serviceDebug includeExceptionDetailInFaults="False" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
  </system.serviceModel>  
</configuration>  

Siehe auchSee Also

ServiceMetadataBehavior
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 über CodeHow to: Publish Metadata for a Service Using Code