Postupy: Publikování metadat služby promocí kódu
Toto je jedno ze dvou témat s postupy, která diskutují o publikování metadat 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í kódu.
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 bezpečně publikovala metadata. Viz vlastní koncový bod zabezpečených metadat.
Další informace o publikování metadat v konfiguračním souboru naleznete v tématu Postupy: Publikování metadat pro službu pomocí konfiguračního souboru. 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, musíte vytvořit základní službu WCF. Základní služba v místním prostředí je poskytována v následujícím kódu.
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;
}
}
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.ServiceModel.Description
<ServiceContract()> _
Public Interface ISimpleService
<OperationContract()> _
Function SimpleMethod(ByVal msg As String) As String
End Interface
Class SimpleService
Implements ISimpleService
Public Function SimpleMethod(ByVal msg As String) As String Implements ISimpleService.SimpleMethod
Console.WriteLine("The caller passed in " + msg)
Return "Hello " + msg
End Function
End Class
Publikování metadat v kódu
V rámci hlavní metody konzolové aplikace vytvořte instanci ServiceHost objektu předáním typu služby a základní adresy.
ServiceHost svcHost = new ServiceHost(typeof(SimpleService), new Uri("http://localhost:8001/MetadataSample"));
Dim svcHost As New ServiceHost(GetType(SimpleService), New Uri("http://localhost:8001/MetadataSample"))
Vytvořte blok try bezprostředně pod kódem pro krok 1. Tím se zachytí všechny výjimky, které se při spuštění služby vyvolá.
try {
Try
} catch (CommunicationException commProblem) { Console.WriteLine("There was a communication problem. " + commProblem.Message); Console.Read(); }
Catch commProblem As CommunicationException Console.WriteLine("There was a communication problem. " + commProblem.Message) Console.Read() End Try
Zkontrolujte, jestli hostitel služby již obsahuje ServiceMetadataBehaviorinstanci , pokud ne, vytvořte novou ServiceMetadataBehavior instanci.
// Check to see if the service host already has a ServiceMetadataBehavior ServiceMetadataBehavior smb = svcHost.Description.Behaviors.Find<ServiceMetadataBehavior>(); // If not, add one if (smb == null) smb = new ServiceMetadataBehavior();
'Check to see if the service host already has a ServiceMetadataBehavior Dim smb As ServiceMetadataBehavior = svcHost.Description.Behaviors.Find(Of ServiceMetadataBehavior)() 'If not, add one If (smb Is Nothing) Then smb = New ServiceMetadataBehavior() End If
Nastavení vlastnosti na HttpGetEnabled
true.
smb.HttpGetEnabled = true;
smb.HttpGetEnabled = True
MetadataExporter Obsahuje ServiceMetadataBehavior vlastnost. PolicyVersion Obsahuje MetadataExporter vlastnost. Nastavte hodnotu PolicyVersion vlastnosti na Policy15hodnotu . Vlastnost PolicyVersion lze také nastavit na Policy12hodnotu . Při nastavení na Policy15 exportér metadat generuje informace o zásadách s metadaty, která odpovídají WS-Policy 1.5. Při nastavení na Policy12 exportér metadat generuje informace o zásadách, které odpovídají WS-Policy 1.2.
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
ServiceMetadataBehavior Přidejte instanci do kolekce chování hostitele služby.
svcHost.Description.Behaviors.Add(smb);
svcHost.Description.Behaviors.Add(smb)
Přidejte koncový bod výměny metadat do hostitele služby.
// Add MEX endpoint svcHost.AddServiceEndpoint( ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex" );
'Add MEX endpoint svcHost.AddServiceEndpoint( _ ServiceMetadataBehavior.MexContractName, _ MetadataExchangeBindings.CreateMexHttpBinding(), _ "mex")
Přidejte koncový bod aplikace do hostitele služby.
// Add application endpoint svcHost.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
'Add application endpoint svcHost.AddServiceEndpoint(GetType(ISimpleService), New WSHttpBinding(), "")
Poznámka:
Pokud do služby nepřidáte žádné koncové body, modul runtime za vás přidá výchozí koncové body. V tomto příkladu, protože služba má nastavenou ServiceMetadataBehavior hodnotu
true
, má služba povolená metadata publikování. Další informace o výchozích koncových bodech naleznete v tématu Zjednodušená konfigurace a Zjednodušená konfigurace pro služby WCF.Otevřete hostitele služby a počkejte na příchozí hovory. Když uživatel stiskne klávesu ENTER, zavřete hostitele služby.
// Open the service host to accept incoming calls svcHost.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. svcHost.Close();
'Open the service host to accept incoming calls svcHost.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. svcHost.Close()
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é. Měla by se zobrazit webová stránka s textem "Jednoduchá služba" v horní části a hned pod textem "Vytvořili jste službu". 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".
Příklad
Následující příklad kódu ukazuje implementaci základní služby WCF, která publikuje metadata pro službu v kódu.
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 svcHost = new ServiceHost(typeof(SimpleService), new Uri("http://localhost:8001/MetadataSample"));
try
{
// Check to see if the service host already has a ServiceMetadataBehavior
ServiceMetadataBehavior smb = svcHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
// If not, add one
if (smb == null)
smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
svcHost.Description.Behaviors.Add(smb);
// Add MEX endpoint
svcHost.AddServiceEndpoint(
ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex"
);
// Add application endpoint
svcHost.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
// Open the service host to accept incoming calls
svcHost.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.
svcHost.Close();
}
catch (CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message);
Console.Read();
}
}
}
}
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.ServiceModel.Description
<ServiceContract()> _
Public Interface ISimpleService
<OperationContract()> _
Function SimpleMethod(ByVal msg As String) As String
End Interface
Class SimpleService
Implements ISimpleService
Public Function SimpleMethod(ByVal msg As String) As String Implements ISimpleService.SimpleMethod
Console.WriteLine("The caller passed in " + msg)
Return "Hello " + msg
End Function
End Class
Module Module1
Sub Main()
Dim svcHost As New ServiceHost(GetType(SimpleService), New Uri("http://localhost:8001/MetadataSample"))
Try
'Check to see if the service host already has a ServiceMetadataBehavior
Dim smb As ServiceMetadataBehavior = svcHost.Description.Behaviors.Find(Of ServiceMetadataBehavior)()
'If not, add one
If (smb Is Nothing) Then
smb = New ServiceMetadataBehavior()
End If
smb.HttpGetEnabled = True
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
svcHost.Description.Behaviors.Add(smb)
'Add MEX endpoint
svcHost.AddServiceEndpoint( _
ServiceMetadataBehavior.MexContractName, _
MetadataExchangeBindings.CreateMexHttpBinding(), _
"mex")
'Add application endpoint
svcHost.AddServiceEndpoint(GetType(ISimpleService), New WSHttpBinding(), "")
'Open the service host to accept incoming calls
svcHost.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.
svcHost.Close()
Catch commProblem As CommunicationException
Console.WriteLine("There was a communication problem. " + commProblem.Message)
Console.Read()
End Try
End Sub
End Module