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
Maak in het App.config-bestand, na het afsluitende
</services>
element, een<behaviors>
element.In het
<behaviors>
-element voegt u een<serviceBehaviors>
-element toe.Voeg een
<behavior>
element toe aan het<serviceBehaviors>
element en geef een waarde op voor hetname
kenmerk van het<behavior>
element.Voeg een
<serviceMetadata>
element toe aan het<behavior>
element. Stel hethttpGetEnabled
kenmerk intrue
op En hetpolicyVersion
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.Voeg een
behaviorConfiguration
kenmerk toe aan het<service>
element en geef het kenmerk op van hetname
<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>
Voeg een of meer
<endpoint>
elementen toe waaraan het contract is ingesteldIMetadataExchange
, 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>
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.
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.
Bouw en voer de consoletoepassing uit.
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
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
settrue
heeft, 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>