Postupy: Publikování metadat služby promocí konfiguračního souboru
Toto je jedno ze dvou témat s postupy, která demonstrují metadata publikování pro službu WCF (Windows Communication Foundation). Existují dva způsoby, jak určit, jak má služba publikovat metadata, pomocí konfiguračního souboru a pomocí kódu. Toto téma ukazuje, jak publikovat metadata pro službu pomocí konfiguračního souboru.
Upozornění
Toto téma ukazuje, jak publikovat metadata nezabezpečeným způsobem. Každý klient může načíst metadata ze služby. Pokud potřebujete, aby služba publikovala metadata zabezpečeným způsobem, přečtěte si téma Vlastní koncový bod zabezpečených metadat.
Další informace o publikování metadat v kódu naleznete v tématu Postupy: Publikování metadat pro službu pomocí kódu. Metadata publikování umožňují klientům načíst metadata pomocí požadavku WS-Transfer GET nebo požadavku HTTP/GET pomocí ?wsdl
řetězce dotazu. Abyste měli jistotu, že kód funguje, vytvořte základní službu WCF. Pro zjednodušení je v následujícím kódu poskytována základní služba v místním prostředí.
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();
}
}
}
}
Tato služba je služba v místním prostředí, která se konfiguruje pomocí konfiguračního souboru. Následující konfigurační soubor slouží jako výchozí bod.
<configuration>
<system.serviceModel>
<services>
<service name="Metadata.Example.SimpleService">
<endpoint address=""
binding="basicHttpBinding"
contract="Metadata.Example.ISimpleService" />
</service>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
Publikování metadat pro službu WCF pomocí konfiguračního souboru aplikace
V souboru App.config za uzavíracím
</services>
elementem<behaviors>
vytvořte element.Do elementu
<behaviors>
<serviceBehaviors>
přidejte prvek.<behavior>
Přidejte prvek do elementu<serviceBehaviors>
a zadejte hodnotu atributuname
elementu<behavior>
.<serviceMetadata>
Přidejte do elementu<behavior>
prvek.httpGetEnabled
Nastavte atribut natrue
Policy15 apolicyVersion
atribut na Policy15.httpGetEnabled
umožňuje službě reagovat na požadavky na metadata provedené požadavkem HTTP GET.policyVersion
informuje službu, aby při generování metadat odpovídala WS-Policy 1.5.Přidejte do elementu
behaviorConfiguration
<service>
atribut a zadejtename
atribut elementu přidaného<behavior>
v kroku 1, jak je znázorněno v následujícím příkladu kódu.<services> <service name="Metadata.Example.SimpleService" behaviorConfiguration="SimpleServiceBehavior"> ... </service> </services> <behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" /> </behavior> </serviceBehaviors> </behaviors>
Přidejte jeden nebo více
<endpoint>
prvků se sadou kontraktůIMetadataExchange
, jak je znázorněno v následujícím příkladu kódu.<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>
U koncových bodů metadat přidaných v předchozím kroku nastavte
binding
atribut na jednu z následujících možností:mexHttpBinding
pro publikaci HTTP.mexHttpsBinding
pro publikaci HTTPS.mexNamedPipeBinding
pro publikaci pojmenovaného kanálu.mexTcpBinding
pro publikování protokolu TCP.
U koncových bodů metadat přidaných v předchozím kroku nastavte adresu na:
Prázdný řetězec, který použije základní adresu hostitelské aplikace jako bod publikace, pokud je základní adresa stejná jako vazba metadat.
Relativní adresa, pokud má hostitelská aplikace základní adresu.
Absolutní adresa.
Vytvořte a spusťte konzolovou aplikaci.
Přejděte na základní adresu služby (
http://localhost:8001/MetadataSample
v této ukázce) a ověřte, že je publikování metadat zapnuté. Pokud ne, zobrazí se v horní části výsledné stránky zpráva: "Publikování metadat pro tuto službu je aktuálně zakázáno".
Použití výchozích koncových bodů
Pokud chcete nakonfigurovat metadata pro službu, která používá výchozí koncové body, zadejte ServiceMetadataBehavior v konfiguračním souboru jako v předchozím příkladu, ale nezadávejte žádné koncové body. Konfigurační soubor by pak vypadal takto.
<configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Vzhledem k tomu, že služba má nastavenou ServiceMetadataBehavior
httpGetEnabled
hodnotutrue
, služba má povolená metadata publikování a protože nebyly explicitně přidány žádné koncové body, modul runtime přidá výchozí koncové body. Další informace o výchozích koncových bodech, vazbách a chování najdete v tématu Zjednodušená konfigurace a zjednodušená konfigurace pro služby WCF.
Příklad
Následující příklad kódu ukazuje implementaci základní služby WCF a konfiguračního souboru, který publikuje metadata pro službu.
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>