Anvisningar: Publicera metadata för en tjänst med hjälp av en konfigurationsfil
Det här är ett av två instruktioner som visar publicering av metadata för en WCF-tjänst (Windows Communication Foundation). Det finns två sätt att ange hur en tjänst ska publicera metadata med hjälp av en konfigurationsfil och med hjälp av kod. Det här avsnittet visar hur du publicerar metadata för en tjänst med hjälp av en konfigurationsfil.
Varning
Det här avsnittet visar hur du publicerar metadata på ett osäkert sätt. Alla klienter kan hämta metadata från tjänsten. Om du kräver att din tjänst publicerar metadata på ett säkert sätt kan du läsa Slutpunkten för anpassade säkra metadata.
Mer information om hur du publicerar metadata i kod finns i Publicera metadata för en tjänst med hjälp av kod. Med publiceringsmetadata kan klienter hämta metadata med hjälp av en GET-begäran för WS-överföring eller en HTTP/GET-begäran med hjälp av frågesträngen ?wsdl
. För att vara säker på att koden fungerar skapar du en grundläggande WCF-tjänst. För enkelhetens skull tillhandahålls en grundläggande lokalt installerad tjänst i följande kod.
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();
}
}
}
}
Den här tjänsten är en lokalt installerad tjänst som konfigureras med hjälp av en konfigurationsfil. Följande konfigurationsfil fungerar som utgångspunkt.
<configuration>
<system.serviceModel>
<services>
<service name="Metadata.Example.SimpleService">
<endpoint address=""
binding="basicHttpBinding"
contract="Metadata.Example.ISimpleService" />
</service>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
Publicera metadata för en WCF-tjänst med hjälp av en programkonfigurationsfil
Skapa ett
<behaviors>
element efter det avslutande</services>
elementet i filen App.config.Lägg till ett
<serviceBehaviors>
element i elementet<behaviors>
.Lägg till ett
<behavior>
element i elementet<serviceBehaviors>
och ange ett värde förname
elementets<behavior>
attribut.Lägg till ett
<serviceMetadata>
element i elementet<behavior>
.httpGetEnabled
Ange attributet tilltrue
ochpolicyVersion
attributet till Policy15.httpGetEnabled
tillåter tjänsten att svara på metadatabegäranden som görs av en HTTP GET-begäran.policyVersion
instruerar tjänsten att följa WS-Policy 1.5 när metadata genereras.Lägg till ett
behaviorConfiguration
attribut i elementet<service>
och angename
attributet för elementet<behavior>
som lades till i steg 1, enligt följande kodexempel.<services> <service name="Metadata.Example.SimpleService" behaviorConfiguration="SimpleServiceBehavior"> ... </service> </services> <behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" /> </behavior> </serviceBehaviors> </behaviors>
Lägg till ett eller flera
<endpoint>
element med kontraktet inställt påIMetadataExchange
, enligt följande kodexempel.<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>
För metadataslutpunkterna som lades till i föregående steg anger du
binding
attributet till något av följande:mexHttpBinding
för HTTP-publicering.mexHttpsBinding
för HTTPS-publicering.mexNamedPipeBinding
för namngiven rörpublikation.mexTcpBinding
för TCP-publicering.
För metadataslutpunkterna som lades till i ett tidigare steg anger du adressen som är lika med:
En tom sträng för att använda värdprogrammets basadress som publikationsplats om basadressen är samma som metadatabindningen.
En relativ adress om värdprogrammet har en basadress.
En absolut adress.
Skapa och kör konsolprogrammet.
Bläddra till basadressen för tjänsten (
http://localhost:8001/MetadataSample
i det här exemplet) och kontrollera att metadatapublicering är aktiverat. Annars visas ett meddelande överst på den resulterande sidan: "Metadatapublicering för den här tjänsten är för närvarande inaktiverad."
Så här använder du standardslutpunkter
Om du vill konfigurera metadata för en tjänst som använder standardslutpunkter anger du ServiceMetadataBehavior i konfigurationsfilen som i föregående exempel, men anger inga slutpunkter. Konfigurationsfilen skulle då se ut så här.
<configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Eftersom tjänsten har värdet ServiceMetadataBehavior
httpGetEnabled
true
har tjänsten publiceringsmetadata aktiverad, och eftersom inga slutpunkter uttryckligen har lagts till lägger körningen till standardslutpunkterna. Mer information om standardslutpunkter, bindningar och beteenden finns i Förenklad konfiguration och förenklad konfiguration för WCF-tjänster.
Exempel
I följande kodexempel visas implementeringen av en grundläggande WCF-tjänst och konfigurationsfilen som publicerar metadata för tjänsten.
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>