Gewusst wie: Veröffentlichen von Metadaten für einen Dienst mithilfe einer Konfigurationsdatei
Dies ist eines der beiden "Gewusst wie"-Themen, die veranschaulichen, wie Sie Metadaten für einen Windows Communication Foundation (WCF)-Dienst veröffentlichen. Es gibt zwei Möglichkeiten zum Veröffentlichen von Metadaten für einen Dienst: mit einer Konfigurationsdatei und mit Code. In diesem Thema wird das Veröffentlichen von Metadaten für einen Dienst mithilfe einer Konfigurationsdatei dargestellt.
Vorsicht: |
---|
In diesem Thema wird das Veröffentlichen von Metadaten auf unsichere Weise dargestellt. Jeder Client kann Metadaten vom Dienst abrufen. Informationen zum sicheren Veröffentlichen von Metadaten für einen Dienst finden Sie unter Benutzerdefinierter sicherer Metadatenendpunkt. |
Weitere Informationen über zum Veröffentlichen von Metadaten im Code finden Sie unter Gewusst wie: Veröffentlichen von Metadaten für einen Dienst über den 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. Erstellen Sie einen grundlegenden WCF-Dienst, um sicherzustellen, dass der Code funktioniert. Der Einfachheit halber wird im folgenden Code ein grundlegender, selbst gehosteter Dienst bereitgestellt.
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("https://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. Die folgende Konfigurationsdatei dient als Ausgangspunkt.
<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 Konfigurationsdatei
Erstellen Sie in der App.config-Datei, nachdem Sie das </services>-Element geschlossen haben, ein <behaviors>-Element.
<behaviors> </behaviors>
Fügen Sie im <behaviors>-Element ein <serviceBehaviors>-Element hinzu.
<behaviors> <serviceBehaviors> </serviceBehaviors> </behaviors>
Fügen Sie ein <behavior>-Element zum <serviceBehaviors>-Element hinzu, und geben Sie einen Wert für das name-Attribut des <behavior>-Elements an.
<behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> </behavior> </serviceBehaviors> </behaviors>
Fügen Sie dem <behavior>-Element ein <serviceMetadata>-Element hinzu. Legen Sie das httpGetEnabledAttribut auf true und das policyVersion-Attribut auf die Richtlinie 1.5 fest. httpGetEnabled ermöglicht es dem Dienst, auf die Metadatenanforderung einer HTTP GET-Anforderung zu antworten. policyVersion teilt dem Dienst mit, bei der Erstellung von Metadaten der WS-Richtlinie 1.5 zu folgen.
<behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" /> </behavior> </serviceBehaviors> </behaviors>
Fügen Sie dem <service>-Element ein behaviorConfiguration-Attribut hinzu, und geben Sie das name-Attribut des in Schritt 1 hinzugefügten <behavior>-Elements an, wie im folgenden Codebeispiel gezeigt.
<services> <service name="Metadata.Example.SimpleService" behaviorConfiguration="SimpleServiceBehavior"> ... </service> </services> <behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" /> </behavior> </serviceBehaviors> </behaviors>
Fügen Sie ein oder mehrere <endpoint>-Elemente hinzu, wobei der Vertrag auf IMetadataExchange festgelegt ist, wie im folgenden Codebeispiel gezeigt.
<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>
Legen Sie für die im vorherigen Schritt hinzugefügten Metadatenendpunkte das binding-Attribut auf einen der folgenden Werte fest:
mexHttpBinding für HTTP-Veröffentlichung.
mexHttpsBinding für HTTPS-Veröffentlichung.
mexNamedPipeBinding für benannte Pipeveröffentlichung.
mexTcpBinding für TCP-Veröffentlichung.
Legen Sie die Adressen für die in einem vorherigen Schritt hinzugefügten Metadatenendpunkte auf Folgendes fest:
Eine leere Zeichenfolge, um die Basisadresse der Hostanwendung als Veröffentlichungspunkt zu verwenden, wenn die Basisadresse mit der Metadatenbindung identisch ist.
Eine relative Adresse, wenn die Hostanwendung über eine Basisadresse verfügt.
Eine absolute Adresse.
Erstellen Sie die Konsolenanwendung, und führen Sie sie aus.
Rufen Sie im Internet Explorer die Basisadresse des Diensts auf (in diesem Beispiel "https://localhost:8001/MetadataSample"), und stellen Sie sicher, dass die Metadatenveröffentlichung aktiviert ist. Wenn nicht, wird oben auf der Ergebnisseite die folgende Meldung angezeigt: "Das Veröffentlichen von Metadaten für diesen Dienst ist derzeit deaktiviert."
So verwenden Sie Standardendpunkte
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. Die Konfigurationsdatei sieht dann wie folgt aus.
<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 dem 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. Weitere Informationen über zu Standardendpunkten, -bindungen und -verhaltensweisen finden Sie unter Vereinfachte Konfiguration und Vereinfachte Konfiguration für WCF-Dienste.
Beispiel
Im folgenden Codebeispiel wird die Implementierung eines einfachen WCF-Diensts und der Konfigurationsdatei, die für diesen Dienst Metadaten veröffentlicht, veranschaulicht.
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("https://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 auch
Aufgaben
Gewusst wie: Hosten eines WCF-Diensts in einer verwalteten Anwendung
Selbst gehostete Dienste
Gewusst wie: Veröffentlichen von Metadaten für einen Dienst über den Code
Verweis
Konzepte
Übersicht über die Metadatenarchitektur
Verwenden von Metadaten