Procedure: Metagegevens voor een service publiceren met behulp van code
Dit is een van de twee onderwerpen over het publiceren van metagegevens voor een WCF-service (Windows Communication Foundation). Er zijn twee manieren om op te geven hoe een service metagegevens moet publiceren, met behulp van een configuratiebestand en code. In dit onderwerp wordt beschreven hoe u metagegevens voor een service publiceert met behulp van een code.
Let op
In dit onderwerp wordt beschreven hoe u metagegevens op een onbeveiligde manier publiceert. Elke client kan de metagegevens ophalen uit de service. Als u wilt dat uw service metagegevens op een veilige manier publiceert. zie aangepast eindpunt voor beveiligde metagegevens.
Zie Voor meer informatie over het publiceren van metagegevens in een configuratiebestand : Metagegevens voor een service publiceren met behulp van een configuratiebestand. Door metagegevens te publiceren, kunnen clients de metagegevens ophalen met behulp van een WS-Transfer GET-aanvraag of een HTTP/GET-aanvraag met behulp van de ?wsdl
querytekenreeks. Om ervoor te zorgen dat de code werkt, moet u een eenvoudige WCF-service maken. De volgende code bevat een eenvoudige zelf-hostende service.
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
Metagegevens publiceren in code
Binnen de hoofdmethode van een consoletoepassing instantieert u een ServiceHost object door het servicetype en het basisadres door te geven.
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"))
Maak een try-blok direct onder de code voor stap 1. Hiermee worden eventuele uitzonderingen onderschept die worden gegenereerd terwijl de service wordt uitgevoerd.
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
Controleer of de servicehost al een ServiceMetadataBehavior, indien niet, een nieuw ServiceMetadataBehavior exemplaar bevat.
// 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
Stel de HttpGetEnabled eigenschap in op
true.
smb.HttpGetEnabled = true;
smb.HttpGetEnabled = True
De ServiceMetadataBehavior bevat een MetadataExporter eigenschap. De MetadataExporter bevat een PolicyVersion eigenschap. Stel de waarde van de PolicyVersion eigenschap in op Policy15. De PolicyVersion eigenschap kan ook worden ingesteld op Policy12. Wanneer deze is ingesteld op Policy15 de metagegevensexporteur, worden beleidsinformatie gegenereerd met de metagegevens die voldoen aan WS-Policy 1.5. Wanneer deze is ingesteld op Policy12 de metagegevensexporteur, worden beleidsinformatie gegenereerd die voldoet aan WS-Policy 1.2.
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
Voeg het ServiceMetadataBehavior exemplaar toe aan de verzameling gedrag van de servicehost.
svcHost.Description.Behaviors.Add(smb);
svcHost.Description.Behaviors.Add(smb)
Voeg het eindpunt voor metagegevensuitwisseling toe aan de servicehost.
// Add MEX endpoint svcHost.AddServiceEndpoint( ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex" );
'Add MEX endpoint svcHost.AddServiceEndpoint( _ ServiceMetadataBehavior.MexContractName, _ MetadataExchangeBindings.CreateMexHttpBinding(), _ "mex")
Voeg een toepassingseindpunt toe aan de servicehost.
// Add application endpoint svcHost.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
'Add application endpoint svcHost.AddServiceEndpoint(GetType(ISimpleService), New WSHttpBinding(), "")
Notitie
Als u geen eindpunten aan de service toevoegt, voegt de runtime standaardeindpunten voor u toe. In dit voorbeeld, omdat de service een ServiceMetadataBehavior set heeft,
true
is publicatiemetagegevens ingeschakeld voor de service. Zie Vereenvoudigde configuratie en vereenvoudigde configuratie voor WCF-services voor meer informatie over standaardeindpunten.Open de servicehost en wacht op binnenkomende oproepen. Wanneer de gebruiker op Enter drukt, sluit u de servicehost.
// 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()
Bouw en voer de consoletoepassing uit.
Blader naar het basisadres van de service (
http://localhost:8001/MetadataSample
in dit voorbeeld) en controleer of het publiceren van metagegevens is ingeschakeld. Er wordt een webpagina weergegeven met de tekst 'Eenvoudige service' bovenaan en direct onder 'U hebt een service gemaakt'. Zo niet, dan wordt boven aan de resulterende pagina het volgende bericht weergegeven: 'Publicatie van metagegevens voor deze service is momenteel uitgeschakeld'.
Opmerking
In het volgende codevoorbeeld ziet u de implementatie van een eenvoudige WCF-service waarmee metagegevens voor de service in code worden gepubliceerd.
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