Delen via


Procedure: Metagegevens voor een service publiceren met behulp van een configuratiebestand

Dit is een van de twee procedures die het publiceren van metagegevens voor een WCF-service (Windows Communication Foundation) demonstreren. Er zijn twee manieren om op te geven hoe een service metagegevens moet publiceren, met behulp van een configuratiebestand en code. In dit onderwerp wordt beschreven hoe u metagegevens voor een service publiceert met behulp van een configuratiebestand.

Let op

In dit onderwerp wordt beschreven hoe u metagegevens op een onbeveiligde manier publiceert. Elke client kan de metagegevens ophalen uit de service. Als u wilt dat uw service metagegevens op een veilige manier publiceert, raadpleegt u Aangepast eindpunt voor beveiligde metagegevens.

Zie Voor meer informatie over het publiceren van metagegevens in code : Metagegevens voor een service publiceren met behulp van code. Door metagegevens te publiceren, kunnen clients de metagegevens ophalen met behulp van een WS-Transfer GET-aanvraag of een HTTP/GET-aanvraag met behulp van de ?wsdl querytekenreeks. Als u er zeker van wilt zijn dat de code werkt, maakt u een eenvoudige WCF-service. Ter vereenvoudiging wordt een eenvoudige zelf-hostende service geleverd in de volgende 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();  
            }  
        }  
    }  
}  

Deze service is een zelf-hostende service, die is geconfigureerd met behulp van een configuratiebestand. Het volgende configuratiebestand fungeert als uitgangspunt.

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

Metagegevens voor een WCF-service publiceren met behulp van een toepassingsconfiguratiebestand

  1. Maak in het App.config-bestand, na het afsluitende </services> element, een <behaviors> element.

  2. In het <behaviors>-element voegt u een <serviceBehaviors>-element toe.

  3. Voeg een <behavior> element toe aan het <serviceBehaviors> element en geef een waarde op voor het name kenmerk van het <behavior> element.

  4. Voeg een <serviceMetadata> element toe aan het <behavior> element. Stel het httpGetEnabled kenmerk in true op En het policyVersion kenmerk op Policy15. httpGetEnabled staat de service toe om te reageren op metagegevensaanvragen die zijn gedaan door een HTTP GET-aanvraag. policyVersion geeft aan dat de service voldoet aan WS-Policy 1.5 bij het genereren van metagegevens.

  5. Voeg een behaviorConfiguration kenmerk toe aan het <service> element en geef het kenmerk op van het name<behavior> element dat is toegevoegd in stap 1, zoals wordt weergegeven in het volgende codevoorbeeld.

    <services>  
      <service  
          name="Metadata.Example.SimpleService"  
          behaviorConfiguration="SimpleServiceBehavior">  
        ...  
      </service>  
    </services>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="SimpleServiceBehavior">  
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    
  6. Voeg een of meer <endpoint> elementen toe waaraan het contract is ingesteld IMetadataExchange, zoals wordt weergegeven in het volgende codevoorbeeld.

    <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. Voor de metagegevenseindpunten die in de vorige stap zijn toegevoegd, stelt u het binding kenmerk in op een van de volgende opties:

    • mexHttpBinding voor HTTP-publicatie.

    • mexHttpsBinding voor HTTPS-publicatie.

    • mexNamedPipeBinding voor benoemde pipe-publicatie.

    • mexTcpBinding voor TCP-publicatie.

  8. Voor de metagegevenseindpunten die zijn toegevoegd in een vorige stap, stelt u het adres in dat gelijk is aan:

    • Een lege tekenreeks voor het gebruik van het basisadres van de hosttoepassing als publicatiepunt als het basisadres hetzelfde is als de metagegevensbinding.

    • Een relatief adres als de hosttoepassing een basisadres heeft.

    • Een absoluut adres.

  9. Bouw en voer de consoletoepassing uit.

  10. Blader naar het basisadres van de service (http://localhost:8001/MetadataSample in dit voorbeeld) en controleer of het publiceren van metagegevens is ingeschakeld. Zo niet, dan wordt boven aan de resulterende pagina het volgende bericht weergegeven: 'Publicatie van metagegevens voor deze service is momenteel uitgeschakeld'.

Standaardeindpunten gebruiken

  1. Als u metagegevens wilt configureren voor een service die gebruikmaakt van standaardeindpunten, geeft u het ServiceMetadataBehavior in het configuratiebestand op zoals in het vorige voorbeeld, maar geeft u geen eindpunten op. Het configuratiebestand ziet er dan als volgt uit.

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

    Omdat de service een ServiceMetadataBehavior set met de httpGetEnabled set trueheeft, heeft de service publicatiemetagegevens ingeschakeld en omdat er geen eindpunten expliciet zijn toegevoegd, worden de standaardeindpunten door de runtime toegevoegd. Zie Vereenvoudigde configuratie en vereenvoudigde configuratie voor WCF-services voor meer informatie over standaardeindpunten, bindingen en gedrag.

Opmerking

In het volgende codevoorbeeld ziet u de implementatie van een eenvoudige WCF-service en het configuratiebestand waarmee metagegevens voor de service worden gepubliceerd.

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>  

Zie ook