Udostępnij za pośrednictwem


Instrukcje: publikowanie metadanych dla usługi za pomocą pliku konfiguracji

Jest to jeden z dwóch tematów z instrukcjami, które przedstawiają publikowanie metadanych dla usługi Windows Communication Foundation (WCF). Istnieją dwa sposoby określania sposobu publikowania metadanych przez usługę przy użyciu pliku konfiguracji i używania kodu. W tym temacie przedstawiono sposób publikowania metadanych dla usługi przy użyciu pliku konfiguracji.

Uwaga

W tym temacie przedstawiono sposób publikowania metadanych w sposób niezabezpieczony. Każdy klient może pobrać metadane z usługi. Jeśli chcesz, aby usługa publikowała metadane w bezpieczny sposób, zobacz Niestandardowy bezpieczny punkt końcowy metadanych.

Aby uzyskać więcej informacji na temat publikowania metadanych w kodzie, zobacz How to: Publish Metadata for a Service Using Code (Instrukcje: publikowanie metadanych dla usługi przy użyciu kodu). Metadane publikowania umożliwiają klientom pobieranie metadanych przy użyciu żądania GET WS-Transfer lub żądania HTTP/GET przy użyciu ?wsdl ciągu zapytania. Aby upewnić się, że kod działa, utwórz podstawową usługę WCF. Dla uproszczenia podstawowa samoobsługowa usługa jest udostępniana w poniższym kodzie.

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();  
            }  
        }  
    }  
}  

Ta usługa jest usługą self-hosted, która jest skonfigurowana przy użyciu pliku konfiguracji. Poniższy plik konfiguracji służy jako punkt początkowy.

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

Aby opublikować metadane dla usługi WCF przy użyciu pliku konfiguracji aplikacji

  1. W pliku App.config po elemecie zamykającym </services> utwórz <behaviors> element.

  2. W elemecie <behaviors> dodaj <serviceBehaviors> element .

  3. <behavior> Dodaj element do <serviceBehaviors> elementu i określ wartość name atrybutu <behavior> elementu.

  4. <serviceMetadata> Dodaj element do <behavior> elementu . httpGetEnabled Ustaw atrybut na true i policyVersion atrybut na Policy15. httpGetEnabled umożliwia usłudze odpowiadanie na żądania metadanych wysyłane przez żądanie HTTP GET. policyVersion informuje usługę o zgodności z usługą WS-Policy 1.5 podczas generowania metadanych.

  5. behaviorConfiguration Dodaj atrybut do <service> elementu i określ name atrybut elementu dodanego <behavior> w kroku 1, jak pokazano w poniższym przykładzie kodu.

    <services>  
      <service  
          name="Metadata.Example.SimpleService"  
          behaviorConfiguration="SimpleServiceBehavior">  
        ...  
      </service>  
    </services>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="SimpleServiceBehavior">  
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    
  6. Dodaj co najmniej jeden <endpoint> element z ustawionym kontraktem na IMetadataExchangewartość , jak pokazano w poniższym przykładzie kodu.

    <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. W przypadku punktów końcowych metadanych dodanych w poprzednim kroku ustaw binding atrybut na jedną z następujących wartości:

    • mexHttpBinding w przypadku publikacji HTTP.

    • mexHttpsBinding w przypadku publikacji HTTPS.

    • mexNamedPipeBinding dla publikacji nazwanej potoku.

    • mexTcpBinding w przypadku publikacji TCP.

  8. W przypadku punktów końcowych metadanych dodanych w poprzednim kroku ustaw adres równy:

    • Pusty ciąg do użycia adresu podstawowego aplikacji hosta jako punktu publikacji, jeśli adres podstawowy jest taki sam jak powiązanie metadanych.

    • Adres względny, jeśli aplikacja hosta ma adres podstawowy.

    • Adres bezwzględny.

  9. Skompiluj i uruchom aplikację konsolową.

  10. Przejdź do podstawowego adresu usługi (http://localhost:8001/MetadataSample w tym przykładzie) i sprawdź, czy publikowanie metadanych jest włączone. Jeśli nie, w górnej części wynikowej strony zostanie wyświetlony komunikat: "Publikowanie metadanych dla tej usługi jest obecnie wyłączone".

Aby użyć domyślnych punktów końcowych

  1. Aby skonfigurować metadane w usłudze korzystającej z domyślnych punktów końcowych, określ ServiceMetadataBehavior w pliku konfiguracji tak jak w poprzednim przykładzie, ale nie określaj żadnych punktów końcowych. Następnie plik konfiguracji będzie wyglądać następująco.

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

    Ponieważ usługa ma element z httpGetEnabled ustawioną wartością true, usługa ma ServiceMetadataBehavior włączone metadane publikowania, a ponieważ żadne punkty końcowe nie zostały jawnie dodane, środowisko uruchomieniowe dodaje domyślne punkty końcowe. Aby uzyskać więcej informacji na temat domyślnych punktów końcowych, powiązań i zachowań, zobacz Uproszczone konfigurowanie i uproszczona konfiguracja usług WCF.

Przykład

Poniższy przykład kodu przedstawia implementację podstawowej usługi WCF i pliku konfiguracji, który publikuje metadane dla usługi.

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>  

Zobacz też