Metadatenveröffentlichungsverhalten

Das Metadaten-Beispiel verdeutlicht, wie die Metadatenveröffentlichungsfunktionen eines Diensts gesteuert werden. Um ein unbeabsichtigtes Veröffentlichen von möglicherweise vertraulichen Dienstmetadaten zu vermeiden, wird mit der Standardkonfiguration für Windows Communication Foundation (WCF)-Dienste die Metadatenveröffentlichung deaktiviert. Dieses Verhalten ist standardmäßig sicher, bedeutet aber auch, dass der zum Aufrufen des Diensts erforderliche Clientcode nicht mithilfe eines Tools zum Importieren von Metadaten (wie „Svcutil.exe“) generiert werden kann. Dies ist nur dann möglich, wenn das Verhalten des Diensts zum Veröffentlichen von Metadaten in der Konfiguration explizit aktiviert ist.

Wichtig

Beachten Sie, dass in diesem Beispiel die Erstellung eines ungesicherten Metadaten-Veröffentlichungsendpunkts veranschaulicht wird. Solche Endpunkte können für anonyme, nicht authentifizierte Benutzer verfügbar sein, allerdings muss vor der Bereitstellung dieser Endpunkte sorgfältig darauf geachtet werden, dass die Offenlegung der Metadaten eines Diensts angemessen ist. Ein Beispiel zum Schützen eines Metadatenendpunkts finden Sie im Beispiel für einen benutzerdefinierten sicheren Metadatenendpunkt.

Das Beispiel basiert auf dem Beispiel Erste Schritte, in dem der ICalculator-Dienstvertrag implementiert wird. In diesem Beispiel ist der Client eine Konsolenanwendung (.exe), und der Dienst wird von IIS (Internet Information Services, Internetinformationsdienste) gehostet.

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.

Damit ein Dienst Metadaten verfügbar macht, muss ServiceMetadataBehavior für den Dienst konfiguriert werden. Wenn dieses Verhalten auftritt, können Sie Metadaten veröffentlichen, indem Sie einen Endpunkt so konfigurieren, dass er den IMetadataExchange-Vertrag als Implementierung eines WS-MEX-(MetadataExchange-)Protokolls verfügbar macht. Zur besseren Benutzerfreundlichkeit hat dieser Vertrag den abgekürzten Konfigurationsnamen "IMetadataExchange" erhalten. In diesem Beispiel wird mexHttpBinding verwendet. Dies ist eine benutzerfreundliche Standardbindung, die wsHttpBinding mit dem Sicherheitsmodus auf None entspricht. Im Endpunkt wird eine relative Adresse von „mex“ verwendet, die beim Auflösen der Dienstbasisadresse eine Endpunktadresse von http://localhost/servicemodelsamples/service.svc/mex ergibt. Im Folgenden wird die Verhaltenskonfiguration gezeigt:

<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
      <!-- The serviceMetadata behavior publishes metadata through
           the IMetadataExchange contract. When this behavior is
           present, you can expose this contract through an endpoint
           as shown below. Setting httpGetEnabled to true publishes
           the service's WSDL at the <baseaddress>?wsdl, for example,
           http://localhost/servicemodelsamples/service.svc?wsdl -->
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Im Folgenden wird der MEX-Endpunkt gezeigt:

<!-- the MEX endpoint is exposed at
     http://localhost/servicemodelsamples/service.svc/mex
     To expose the IMetadataExchange contract, you
     must enable the serviceMetadata behavior as demonstrated
     previously. -->
<endpoint address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />

In diesem Beispiel wird die HttpGetEnabled-Eigenschaft auf true festgelegt, wodurch auch die Metadaten der Dienste mit HTTP GET verfügbar gemacht werden. Um einen HTTP GET-Metadatenendpunkt zu aktivieren, muss der Dienst eine HTTP-Basisadresse haben. Die Abfragezeichenfolge ?wsdl wird auf die Basisadresse des Diensts angewendet, um auf die Metadaten zuzugreifen. Wenn Sie beispielsweise die WSDL für den Dienst einem Webbrowser anzeigen möchten, verwenden Sie die Adresse http://localhost/servicemodelsamples/service.svc?wsdl. Alternativ können Sie dieses Verhalten verwenden, um Metadaten durch Festlegen von HttpsGetEnabled auf true über HTTPS verfügbar zu machen. Dies erfordert eine HTTPS-Basisadresse.

Um auf den MEX-Endpunkt des Diensts zuzugreifen, verwenden Sie das ServiceModel Metadata Utility Tool (Svcutil.exe).

svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs

Dadurch wird ein Client auf der Grundlage der Metadaten des Diensts generiert.

Wenn Sie mithilfe von HTTP GET auf die Metadaten des Diensts zugreifen möchten, verwenden Sie in Ihrem Browser http://localhost/servicemodelsamples/service.svc?wsdl.

Wenn Sie dieses Verhalten entfernen und versuchen, den Dienst zu öffnen, erhalten Sie einen Ausnahmefehler. Dieser Fehler tritt auf, da der mit dem IMetadataExchange-Vertrag konfigurierte Endpunkt ohne das Verhalten keine Implementierung hat.

Wenn Sie HttpGetEnabled auf false festlegen, wird anstelle der Metadaten des Diensts die CalculatorService-Hilfeseite angezeigt.

So können Sie das Beispiel einrichten, erstellen und ausführen

  1. Stellen Sie sicher, dass Sie die Beispiele zum einmaligen Setupverfahren für Windows Communication Foundation ausgeführt haben.

  2. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.

  3. Wenn Sie das Beispiel in einer Konfiguration mit einem Computer oder über Computer hinweg ausführen möchten, folgen Sie den Anweisungen unter Durchführen der Windows Communication Foundation-Beispiele.