Zachowanie publikowania metadanych

W przykładzie Metadata pokazano, jak kontrolować funkcje publikowania metadanych usługi. Aby zapobiec przypadkowemu ujawnieniu potencjalnie poufnych metadanych usługi, domyślna konfiguracja usług Windows Communication Foundation (WCF) wyłącza publikowanie metadanych. To zachowanie jest domyślnie bezpieczne, ale oznacza również, że nie można użyć narzędzia importowania metadanych (takiego jak Svcutil.exe), aby wygenerować kod klienta wymagany do wywołania usługi, chyba że zachowanie publikowania metadanych usługi jest jawnie włączone w konfiguracji.

Ważne

W celu zapewnienia przejrzystości w tym przykładzie pokazano, jak utworzyć niezabezpieczony punkt końcowy publikowania metadanych. Takie punkty końcowe są potencjalnie dostępne dla anonimowych nieuwierzytelnionych użytkowników i należy zachować ostrożność przed wdrożeniem takich punktów końcowych, aby zapewnić, że publiczne ujawnienie metadanych usługi jest odpowiednie. Zapoznaj się z przykładem niestandardowego bezpiecznego punktu końcowego metadanych, aby zapoznać się z przykładem, który zabezpiecza punkt końcowy metadanych.

Przykład jest oparty na rozpoczynaniu pracy, która implementuje ICalculator kontrakt usługi. W tym przykładzie klient jest aplikacją konsolową (.exe), a usługa jest hostowana przez usługi Internet Information Services (IIS).

Uwaga

Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.

Aby usługa uwidaczniała metadane, ServiceMetadataBehavior musi być skonfigurowana w usłudze. Gdy to zachowanie jest obecne, można opublikować metadane, konfigurując punkt końcowy w celu uwidocznienia kontraktu IMetadataExchange jako implementacji protokołu WS-MetadataExchange (MEX). Dla wygody ten kontrakt otrzymał skróconą nazwę konfiguracji "IMetadataExchange". W tym przykładzie użyto standardowego mexHttpBindingpowiązania , który jest wygodnym powiązaniem odpowiadającym wsHttpBinding trybowi zabezpieczeń ustawionemu na Nonewartość . Względny adres "mex" jest używany w punkcie końcowym, który po rozpoznaniu względem adresu podstawowego usług powoduje adres punktu końcowego http://localhost/servicemodelsamples/service.svc/mex. Poniżej przedstawiono konfigurację zachowania:

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

Poniżej przedstawiono punkt końcowy MEX.

<!-- 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" />

Ten przykład ustawia HttpGetEnabled właściwość na true, która uwidacznia również metadane usługi przy użyciu protokołu HTTP GET. Aby włączyć punkt końcowy metadanych HTTP GET, usługa musi mieć podstawowy adres HTTP. Ciąg ?wsdl zapytania jest używany na podstawowym adresie usługi w celu uzyskania dostępu do metadanych. Aby na przykład wyświetlić plik WSDL dla usługi w przeglądarce internetowej, użyj adresu http://localhost/servicemodelsamples/service.svc?wsdl. Alternatywnie możesz użyć tego zachowania, aby uwidocznić metadane za pośrednictwem protokołu HTTPS, ustawiając wartość HttpsGetEnabled .true Wymaga to podstawowego adresu HTTPS.

Aby uzyskać dostęp do punktu końcowego MEX usługi, użyj narzędzia ServiceModel Metadata Tool (Svcutil.exe).

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

Spowoduje to wygenerowanie klienta na podstawie metadanych usługi.

Aby uzyskać dostęp do metadanych usługi przy użyciu protokołu HTTP GET, wskaż w przeglądarce adres http://localhost/servicemodelsamples/service.svc?wsdl.

Jeśli usuniesz to zachowanie i spróbujesz otworzyć usługę, otrzymasz wyjątek. Ten błąd występuje, ponieważ bez zachowania punkt końcowy skonfigurowany za pomocą kontraktu IMetadataExchange nie ma implementacji.

Jeśli ustawiono wartość HttpGetEnabledfalse, zostanie wyświetlona strona pomocy CalculatorService zamiast wyświetlania metadanych usługi.

Aby skonfigurować, skompilować i uruchomić przykład

  1. Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.

  2. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

  3. Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.