Delen via


Procedure: Programmatisch detectie toevoegen aan een WCF-service en -client

In dit onderwerp wordt uitgelegd hoe u een WCF-service (Windows Communication Foundation) detecteerbaar maakt. Deze is gebaseerd op het self-hostvoorbeeld .

Het bestaande self-hostservicevoorbeeld voor Detectie configureren

  1. Open de self-hostoplossing in Visual Studio 2012. Het voorbeeld bevindt zich in de map TechnologySamples\Basic\Service\Hosting\SelfHost.

  2. Voeg een verwijzing naar System.ServiceModel.Discovery.dll het serviceproject toe. Mogelijk ziet u een foutbericht met de tekst 'Systeem. ServiceModel.Discovery.dll of een van de bijbehorende afhankelijkheden vereist een latere versie van .NET Framework dan de versie die is opgegeven in het project ..." Als u dit bericht ziet, klikt u met de rechtermuisknop op het project in Solution Explorer en kiest u Eigenschappen. Zorg ervoor dat het doelframework .NET Framework 4.6.1 is in het venster Projecteigenschappen.

  3. Open het bestand Service.cs en voeg de volgende using instructie toe.

    using System.ServiceModel.Discovery;
    
  4. Voeg in de Main() methode in de using instructie een ServiceDiscoveryBehavior exemplaar toe aan de servicehost.

    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());
    
            // ...
        }
    }
    

    Hiermee ServiceDiscoveryBehavior geeft u op dat de service waarop deze wordt toegepast, detecteerbaar is.

  5. Voeg direct na de code waarmee de servicehost wordt toegevoegd een UdpDiscoveryEndpoint aan de ServiceDiscoveryBehaviorservicehost toe.

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

    Deze code geeft aan dat detectieberichten moeten worden verzonden naar het standaard UDP-detectie-eindpunt.

Een clienttoepassing maken die gebruikmaakt van detectie om de service aan te roepen

  1. Voeg een nieuwe consoletoepassing toe aan de oplossing met de naam DiscoveryClientApp.

  2. Een verwijzing toevoegen aan System.ServiceModel.dll en System.ServiceModel.Discovery.dll

  3. Kopieer de GeneratedClient.cs- en App.config-bestanden van het bestaande clientproject naar het nieuwe DiscoveryClientApp-project. Klik hiervoor met de rechtermuisknop op de bestanden in Solution Explorer, selecteer Kopiëren en selecteer vervolgens het DiscoveryClientApp-project , klik met de rechtermuisknop en selecteer Plakken.

  4. Open Program.cs.

  5. Voeg de volgende using instructies toe.

    using System.ServiceModel;
    using System.ServiceModel.Discovery;
    using Microsoft.ServiceModel.Samples;
    
  6. Voeg een statische methode toe die aan de Program klasse wordt aangeroepenFindCalculatorServiceAddress().

    static EndpointAddress FindCalculatorServiceAddress()
    {
    }
    

    Deze methode maakt gebruik van detectie om naar de CalculatorService service te zoeken.

  7. Maak in de FindCalculatorServiceAddress methode een nieuw DiscoveryClient exemplaar, waarbij een UdpDiscoveryEndpoint aan de constructor wordt doorgegeven.

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

    Dit vertelt WCF dat de DiscoveryClient klasse het standaard UDP-detectie-eindpunt moet gebruiken om detectieberichten te verzenden en te ontvangen.

  8. Roep op de volgende regel de Find methode aan en geef een FindCriteria exemplaar op dat het servicecontract bevat waarnaar u wilt zoeken. Geef ICalculatorin dit geval op.

    // Find ICalculatorService endpoints
    FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(ICalculator)));
    
  9. Controleer na de aanroep om Findte controleren of er ten minste één overeenkomende service is en de eerste overeenkomende service retourneert EndpointAddress . Retourneer anders null.

    if (findResponse.Endpoints.Count > 0)
    {
        return findResponse.Endpoints[0].Address;
    }
    else
    {
        return null;
    }
    
  10. Voeg een statische methode toe met de naam InvokeCalculatorService aan de Program klasse.

    static void InvokeCalculatorService(EndpointAddress endpointAddress)
    {
    }
    

    Deze methode gebruikt het eindpuntadres dat wordt geretourneerd om FindCalculatorServiceAddress de rekenmachineservice aan te roepen.

  11. Maak in de InvokeCalculatorService methode een exemplaar van de CalculatorServiceClient klasse. Deze klasse wordt gedefinieerd door het self-hostvoorbeeld . Deze is gegenereerd met behulp van Svcutil.exe.

    // Create a client
    CalculatorClient client = new CalculatorClient();
    
  12. Stel op de volgende regel het eindpuntadres van de client in op het eindpuntadres dat wordt geretourneerd door FindCalculatorServiceAddress().

    // Connect to the discovered service endpoint
    client.Endpoint.Address = endpointAddress;
    
  13. Onmiddellijk na de code voor de vorige stap roept u de methoden aan die worden weergegeven door de rekenmachineservice.

    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. Voeg code toe aan de Main() methode in de Program klasse die moet worden aangeroepen FindCalculatorServiceAddress.

    public static void Main()
    {
        EndpointAddress endpointAddress = FindCalculatorServiceAddress();
    }
    
  15. Roep op de volgende regel het InvokeCalculatorService() eindpuntadres aan dat is geretourneerd door FindCalculatorServiceAddress().

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

De toepassing testen

  1. Open een opdrachtprompt met verhoogde bevoegdheid en voer Service.exe uit.

  2. Open een opdrachtprompt en voer Discoveryclientapp.exe uit.

  3. De uitvoer van service.exe moet eruitzien als de volgende uitvoer.

    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. De uitvoer van Discoveryclientapp.exe moet eruitzien als de volgende uitvoer.

    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.
    

Opmerking

Hier volgt een lijst met de code voor dit voorbeeld. Omdat deze code is gebaseerd op het self-hostvoorbeeld , worden alleen de bestanden vermeld die worden gewijzigd.

// 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();

        }
    }
}

Zie ook