Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 atributunameelementu<behavior>.<serviceMetadata>Přidejte do elementu<behavior>prvek.httpGetEnabledNastavte atribut natruePolicy15 apolicyVersionatribut na Policy15.httpGetEnabledumožňuje službě reagovat na požadavky na metadata provedené požadavkem HTTP GET.policyVersioninformuje službu, aby při generování metadat odpovídala WS-Policy 1.5.Přidejte do elementu
behaviorConfiguration<service>atribut a zadejtenameatribut 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
bindingatribut na jednu z následujících možností:mexHttpBindingpro publikaci HTTP.mexHttpsBindingpro publikaci HTTPS.mexNamedPipeBindingpro publikaci pojmenovaného kanálu.mexTcpBindingpro 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/MetadataSamplev 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
httpGetEnabledhodnotutrue, 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>