Dela via


Gör så här: Publicera metadata för en tjänst med hjälp av kod

Det här är ett av två instruktioner som diskuterar publicering av metadata för en WCF-tjänst (Windows Communication Foundation). Det finns två sätt att ange hur en tjänst ska publicera metadata med hjälp av en konfigurationsfil och med hjälp av kod. Det här avsnittet visar hur du publicerar metadata för en tjänst med hjälp av en kod.

Varning

Det här avsnittet visar hur du publicerar metadata på ett osäkert sätt. Alla klienter kan hämta metadata från tjänsten. Om du behöver din tjänst för att publicera metadata på ett säkert sätt. se Slutpunkt för anpassade säkra metadata.

Mer information om hur du publicerar metadata i en konfigurationsfil finns i Så här publicerar du metadata för en tjänst med hjälp av en konfigurationsfil. Med publiceringsmetadata kan klienter hämta metadata med hjälp av en GET-begäran för WS-överföring eller en HTTP/GET-begäran med hjälp av frågesträngen ?wsdl . För att vara säker på att koden fungerar måste du skapa en grundläggande WCF-tjänst. En grundläggande lokalt installerad tjänst tillhandahålls i följande kod.

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

Publicera metadata i kod

  1. I huvudmetoden för ett konsolprogram instansierar du ett ServiceHost objekt genom att skicka in tjänsttypen och basadressen.

    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"))
    
  2. Skapa ett försöksblock direkt under koden för steg 1. Detta fångar upp eventuella undantag som genereras när tjänsten körs.

    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
    
  3. Kontrollera om tjänstvärden redan innehåller en ServiceMetadataBehavior, om inte, skapa en ny ServiceMetadataBehavior instans.

    // 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
    
  4. Ange egenskapen HttpGetEnabled till true.

    smb.HttpGetEnabled = true;
    
    smb.HttpGetEnabled = True
    
  5. Innehåller ServiceMetadataBehavior en MetadataExporter egenskap. Innehåller MetadataExporter en PolicyVersion egenskap. Ange värdet för PolicyVersion egenskapen till Policy15. Egenskapen PolicyVersion kan också anges till Policy12. När den är inställd på Policy15 metadataexportören genereras principinformation med metadata som" överensstämmer med WS-Policy 1.5. När värdet är inställt på Policy12 metadataexportören genereras principinformation som överensstämmer med WS-Policy 1.2.

    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
    
    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
    
  6. Lägg till instansen ServiceMetadataBehavior i tjänstvärdens beteendesamling.

    svcHost.Description.Behaviors.Add(smb);
    
    svcHost.Description.Behaviors.Add(smb)
    
  7. Lägg till exchange-slutpunkten för metadata till tjänstvärden.

    // Add MEX endpoint
    svcHost.AddServiceEndpoint(
      ServiceMetadataBehavior.MexContractName,
      MetadataExchangeBindings.CreateMexHttpBinding(),
      "mex"
    );
    
    'Add MEX endpoint
    svcHost.AddServiceEndpoint( _
          ServiceMetadataBehavior.MexContractName, _
          MetadataExchangeBindings.CreateMexHttpBinding(), _
          "mex")
    
  8. Lägg till en programslutpunkt till tjänstvärden.

    // Add application endpoint
    svcHost.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
    
    'Add application endpoint
    svcHost.AddServiceEndpoint(GetType(ISimpleService), New WSHttpBinding(), "")
    

    Kommentar

    Om du inte lägger till några slutpunkter i tjänsten lägger körningen till standardslutpunkter åt dig. I det här exemplet, eftersom tjänsten har angetts ServiceMetadataBehavior till true, har tjänsten publiceringsmetadata aktiverat. Mer information om standardslutpunkter finns i Förenklad konfiguration och förenklad konfiguration för WCF-tjänster.

  9. Öppna tjänstvärden och vänta på inkommande samtal. När användaren trycker på RETUR stänger du tjänstvärden.

    // 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()
    
  10. Skapa och kör konsolprogrammet.

  11. Bläddra till basadressen för tjänsten (http://localhost:8001/MetadataSample i det här exemplet) och kontrollera att metadatapublicering är aktiverat. Du bör se en webbsida med texten "Enkel tjänst" högst upp och direkt under "Du har skapat en tjänst". Annars visas ett meddelande överst på den resulterande sidan: "Metadatapublicering för den här tjänsten är för närvarande inaktiverad."

Exempel

I följande kodexempel visas implementeringen av en grundläggande WCF-tjänst som publicerar metadata för tjänsten i kod.

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

Se även