Instrukcje: publikowanie metadanych dla usługi za pomocą pliku konfiguracji
Jest to jeden z dwóch tematów z instrukcjami, które przedstawiają publikowanie metadanych dla usługi Windows Communication Foundation (WCF). Istnieją dwa sposoby określania sposobu publikowania metadanych przez usługę przy użyciu pliku konfiguracji i używania kodu. W tym temacie przedstawiono sposób publikowania metadanych dla usługi przy użyciu pliku konfiguracji.
Uwaga
W tym temacie przedstawiono sposób publikowania metadanych w sposób niezabezpieczony. Każdy klient może pobrać metadane z usługi. Jeśli chcesz, aby usługa publikowała metadane w bezpieczny sposób, zobacz Niestandardowy bezpieczny punkt końcowy metadanych.
Aby uzyskać więcej informacji na temat publikowania metadanych w kodzie, zobacz How to: Publish Metadata for a Service Using Code (Instrukcje: publikowanie metadanych dla usługi przy użyciu kodu). Metadane publikowania umożliwiają klientom pobieranie metadanych przy użyciu żądania GET WS-Transfer lub żądania HTTP/GET przy użyciu ?wsdl
ciągu zapytania. Aby upewnić się, że kod działa, utwórz podstawową usługę WCF. Dla uproszczenia podstawowa samoobsługowa usługa jest udostępniana w poniższym kodzie.
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();
}
}
}
}
Ta usługa jest usługą self-hosted, która jest skonfigurowana przy użyciu pliku konfiguracji. Poniższy plik konfiguracji służy jako punkt początkowy.
<configuration>
<system.serviceModel>
<services>
<service name="Metadata.Example.SimpleService">
<endpoint address=""
binding="basicHttpBinding"
contract="Metadata.Example.ISimpleService" />
</service>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
Aby opublikować metadane dla usługi WCF przy użyciu pliku konfiguracji aplikacji
W pliku App.config po elemecie zamykającym
</services>
utwórz<behaviors>
element.W elemecie
<behaviors>
dodaj<serviceBehaviors>
element .<behavior>
Dodaj element do<serviceBehaviors>
elementu i określ wartośćname
atrybutu<behavior>
elementu.<serviceMetadata>
Dodaj element do<behavior>
elementu .httpGetEnabled
Ustaw atrybut natrue
ipolicyVersion
atrybut na Policy15.httpGetEnabled
umożliwia usłudze odpowiadanie na żądania metadanych wysyłane przez żądanie HTTP GET.policyVersion
informuje usługę o zgodności z usługą WS-Policy 1.5 podczas generowania metadanych.behaviorConfiguration
Dodaj atrybut do<service>
elementu i określname
atrybut elementu dodanego<behavior>
w kroku 1, jak pokazano w poniższym przykładzie kodu.<services> <service name="Metadata.Example.SimpleService" behaviorConfiguration="SimpleServiceBehavior"> ... </service> </services> <behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" /> </behavior> </serviceBehaviors> </behaviors>
Dodaj co najmniej jeden
<endpoint>
element z ustawionym kontraktem naIMetadataExchange
wartość , jak pokazano w poniższym przykładzie kodu.<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>
W przypadku punktów końcowych metadanych dodanych w poprzednim kroku ustaw
binding
atrybut na jedną z następujących wartości:mexHttpBinding
w przypadku publikacji HTTP.mexHttpsBinding
w przypadku publikacji HTTPS.mexNamedPipeBinding
dla publikacji nazwanej potoku.mexTcpBinding
w przypadku publikacji TCP.
W przypadku punktów końcowych metadanych dodanych w poprzednim kroku ustaw adres równy:
Pusty ciąg do użycia adresu podstawowego aplikacji hosta jako punktu publikacji, jeśli adres podstawowy jest taki sam jak powiązanie metadanych.
Adres względny, jeśli aplikacja hosta ma adres podstawowy.
Adres bezwzględny.
Skompiluj i uruchom aplikację konsolową.
Przejdź do podstawowego adresu usługi (
http://localhost:8001/MetadataSample
w tym przykładzie) i sprawdź, czy publikowanie metadanych jest włączone. Jeśli nie, w górnej części wynikowej strony zostanie wyświetlony komunikat: "Publikowanie metadanych dla tej usługi jest obecnie wyłączone".
Aby użyć domyślnych punktów końcowych
Aby skonfigurować metadane w usłudze korzystającej z domyślnych punktów końcowych, określ ServiceMetadataBehavior w pliku konfiguracji tak jak w poprzednim przykładzie, ale nie określaj żadnych punktów końcowych. Następnie plik konfiguracji będzie wyglądać następująco.
<configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Ponieważ usługa ma element z
httpGetEnabled
ustawioną wartościątrue
, usługa ma ServiceMetadataBehavior włączone metadane publikowania, a ponieważ żadne punkty końcowe nie zostały jawnie dodane, środowisko uruchomieniowe dodaje domyślne punkty końcowe. Aby uzyskać więcej informacji na temat domyślnych punktów końcowych, powiązań i zachowań, zobacz Uproszczone konfigurowanie i uproszczona konfiguracja usług WCF.
Przykład
Poniższy przykład kodu przedstawia implementację podstawowej usługi WCF i pliku konfiguracji, który publikuje metadane dla usługi.
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>