Dela via


Gör så här: Lägg programmatiskt till identifieringsbarhet till en WCF-tjänst och -klient

Det här avsnittet beskriver hur du gör en WCF-tjänst (Windows Communication Foundation) identifierbar. Den baseras på exemplet Självvärd .

Så här konfigurerar du det befintliga självvärdtjänstexemplet för identifiering

  1. Öppna självvärdslösningen i Visual Studio 2012. Exemplet finns i katalogen TechnologySamples\Basic\Service\Hosting\SelfHost.

  2. Lägg till en referens till System.ServiceModel.Discovery.dll tjänstprojektet. Du kan se ett felmeddelande med texten "System. ServiceModel.Discovery.dll eller något av dess beroenden kräver en senare version av .NET Framework än den som anges i projektet ..." Om du ser det här meddelandet högerklickar du på projektet i Solution Explorer och väljer Egenskaper. I fönstret Projektegenskaper kontrollerar du att Target Framework är .NET Framework 4.6.1.

  3. Öppna filen Service.cs och lägg till följande using direktiv.

    using System.ServiceModel.Discovery;
    
  4. Main() I -metoden i -instruktionen using lägger du till en ServiceDiscoveryBehavior instans till tjänstvärden.

    public static void Main()
    {
        // Create a ServiceHost for the CalculatorService type.
        using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService)))
        {
            // Add a ServiceDiscoveryBehavior
            serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
    
            // ...
        }
    }
    

    ServiceDiscoveryBehavior Anger att den tjänst som den tillämpas på kan identifieras.

  5. Lägg till en UdpDiscoveryEndpoint till tjänstvärden direkt efter koden som lägger till ServiceDiscoveryBehavior.

    // Add ServiceDiscoveryBehavior
    serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
    
    // Add a UdpDiscoveryEndpoint
    serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());
    

    Den här koden anger att identifieringsmeddelanden ska skickas till UDP-standardidentifieringsslutpunkten.

Skapa ett klientprogram som använder identifiering för att anropa tjänsten

  1. Lägg till ett nytt konsolprogram i lösningen med namnet DiscoveryClientApp.

  2. Lägg till en referens till System.ServiceModel.dll och System.ServiceModel.Discovery.dll

  3. Kopiera filerna GeneratedClient.cs och App.config från det befintliga klientprojektet till det nya DiscoveryClientApp-projektet. Det gör du genom att högerklicka på filerna i Solution Explorer, välja Kopiera och sedan välja projektet DiscoveryClientApp , högerklicka och välja Klistra in.

  4. Öppna Program.cs.

  5. Lägg till följande using direktiv.

    using System.ServiceModel;
    using System.ServiceModel.Discovery;
    using Microsoft.ServiceModel.Samples;
    
  6. Lägg till en statisk metod som heter FindCalculatorServiceAddress() till Program klassen.

    static EndpointAddress FindCalculatorServiceAddress()
    {
    }
    

    Den här metoden använder identifiering för att söka CalculatorService efter tjänsten.

  7. FindCalculatorServiceAddress I metoden skapar du en ny DiscoveryClient instans och skickar en UdpDiscoveryEndpoint till konstruktorn.

    static EndpointAddress FindCalculatorServiceAddress()
    {
        // Create DiscoveryClient
        DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
    }
    

    Detta talar om för WCF att DiscoveryClient klassen ska använda UDP-standardidentifieringsslutpunkten för att skicka och ta emot identifieringsmeddelanden.

  8. På nästa rad anropar Find du metoden och anger en FindCriteria instans som innehåller det tjänstkontrakt som du vill söka efter. I det här fallet anger du ICalculator.

    // Find ICalculatorService endpoints
    FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(ICalculator)));
    
  9. Efter anropet till Findkontrollerar du om det finns minst en matchande tjänst och returnerar den EndpointAddress första matchande tjänsten. Annars returnerar du null.

    if (findResponse.Endpoints.Count > 0)
    {
        return findResponse.Endpoints[0].Address;
    }
    else
    {
        return null;
    }
    
  10. Lägg till en statisk metod med namnet InvokeCalculatorService i Program klassen.

    static void InvokeCalculatorService(EndpointAddress endpointAddress)
    {
    }
    

    Den här metoden använder slutpunktsadressen som returneras från FindCalculatorServiceAddress för att anropa kalkylatortjänsten.

  11. InvokeCalculatorService I metoden skapar du en instans av CalculatorServiceClient klassen. Den här klassen definieras av självvärdexemplet . Det genererades med hjälp av Svcutil.exe.

    // Create a client
    CalculatorClient client = new CalculatorClient();
    
  12. På nästa rad anger du slutpunktsadressen för klienten till den slutpunktsadress som returneras från FindCalculatorServiceAddress().

    // Connect to the discovered service endpoint
    client.Endpoint.Address = endpointAddress;
    
  13. Omedelbart efter koden för föregående steg anropar du de metoder som exponeras av kalkylatortjänsten.

    Console.WriteLine("Invoking CalculatorService at {0}", endpointAddress);
    
    double value1 = 100.00D;
    double value2 = 15.99D;
    
    // Call the Add service operation.
    double result = client.Add(value1, value2);
    Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
    
    // Call the Subtract service operation.
    result = client.Subtract(value1, value2);
    Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
    
    // Call the Multiply service operation.
    result = client.Multiply(value1, value2);
    Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
    
    // Call the Divide service operation.
    result = client.Divide(value1, value2);
    Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
    Console.WriteLine();
    
    //Closing the client gracefully closes the connection and cleans up resources
    client.Close();
    
  14. Lägg till kod i Main() -metoden i Program klassen för att anropa FindCalculatorServiceAddress.

    public static void Main()
    {
        EndpointAddress endpointAddress = FindCalculatorServiceAddress();
    }
    
  15. På nästa rad anropar InvokeCalculatorService() du och skickar den slutpunktsadress som returneras från FindCalculatorServiceAddress().

    if (endpointAddress != null)
    {
        InvokeCalculatorService(endpointAddress);
    }
    
    Console.WriteLine("Press <ENTER> to exit.");
    Console.ReadLine();
    

Testa programmet

  1. Öppna en upphöjd kommandotolk och kör Service.exe.

  2. Öppna en kommandotolk och kör Discoveryclientapp.exe.

  3. Utdata från service.exe bör se ut som följande utdata.

    Received Add(100,15.99)
    Return: 115.99
    Received Subtract(100,15.99)
    Return: 84.01
    Received Multiply(100,15.99)
    Return: 1599
    Received Divide(100,15.99)
    Return: 6.25390869293308
    
  4. Utdata från Discoveryclientapp.exe bör se ut som följande utdata.

    Invoking CalculatorService at http://localhost:8000/ServiceModelSamples/service
    Add(100,15.99) = 115.99
    Subtract(100,15.99) = 84.01
    Multiply(100,15.99) = 1599
    Divide(100,15.99) = 6.25390869293308
    
    Press <ENTER> to exit.
    

Exempel

Följande är en lista över koden för det här exemplet. Eftersom den här koden baseras på självvärdexemplet visas endast de filer som ändras.

// Service.cs
using System;
using System.Configuration;
using System.ServiceModel;
using System.ServiceModel.Discovery;

namespace Microsoft.ServiceModel.Samples
{
    // See SelfHost sample for service contract and implementation
    // ...

        // Host the service within this EXE console application.
        public static void Main()
        {
            // Create a ServiceHost for the CalculatorService type.
            using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService)))
            {
                // Add the ServiceDiscoveryBehavior to make the service discoverable
                serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
                serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());

                // Open the ServiceHost to create listeners and start listening for messages.
                serviceHost.Open();

                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();
            }
        }
    }
}
// Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Discovery;
using Microsoft.ServiceModel.Samples;
using System.Text;

namespace DiscoveryClientApp
{
    class Program
    {
        static EndpointAddress FindCalculatorServiceAddress()
        {
            // Create DiscoveryClient
            DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());

            // Find ICalculatorService endpoints
            FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(ICalculator)));

            if (findResponse.Endpoints.Count > 0)
            {
                return findResponse.Endpoints[0].Address;
            }
            else
            {
                return null;
            }
        }

        static void InvokeCalculatorService(EndpointAddress endpointAddress)
        {
            // Create a client
            CalculatorClient client = new CalculatorClient();

            // Connect to the discovered service endpoint
            client.Endpoint.Address = endpointAddress;

            Console.WriteLine("Invoking CalculatorService at {0}", endpointAddress);

            double value1 = 100.00D;
            double value2 = 15.99D;

            // Call the Add service operation.
            double result = client.Add(value1, value2);
            Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

            // Call the Subtract service operation.
            result = client.Subtract(value1, value2);
            Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);

            // Call the Multiply service operation.
            result = client.Multiply(value1, value2);
            Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);

            // Call the Divide service operation.
            result = client.Divide(value1, value2);
            Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
            Console.WriteLine();

            //Closing the client gracefully closes the connection and cleans up resources
            client.Close();
        }
        static void Main(string[] args)
        {
            EndpointAddress endpointAddress = FindCalculatorServiceAddress();

            if (endpointAddress != null)
            {
                InvokeCalculatorService(endpointAddress);
            }

            Console.WriteLine("Press <ENTER> to exit.");
            Console.ReadLine();

        }
    }
}

Se även