Share via


Přehled vytváření koncových bodů

Veškerá komunikace se službou Windows Communication Foundation (WCF) probíhá prostřednictvím koncových bodů služby. Koncové body poskytují klientům přístup k funkcím, které služba WCF nabízí. Tato část popisuje strukturu koncového bodu a popisuje, jak definovat koncový bod v konfiguraci a v kódu.

Struktura koncového bodu

Každý koncový bod obsahuje adresu, která označuje, kde najít koncový bod, vazbu, která určuje, jak může klient komunikovat s koncovým bodem, a kontrakt, který identifikuje dostupné metody.

  • Adresa. Adresa jednoznačně identifikuje koncový bod a řekne potenciálním příjemcům, kde se služba nachází. Představuje se v objektovém modelu EndpointAddress WCF adresou, která obsahuje identifikátor URI (Uniform Resource Identifier) a vlastnosti adresy, které zahrnují identitu, některé elementy WSDL (Web Services Description Language) a kolekci volitelných hlaviček. Volitelné hlavičky poskytují další podrobné informace o adresování k identifikaci koncového bodu nebo interakci s ním. Další informace najdete v tématu Zadání adresy koncového bodu.

  • Vazba. Vazba určuje, jak komunikovat s koncovým bodem. Vazba určuje, jak koncový bod komunikuje se světem, včetně toho, který přenosový protokol se má použít (například TCP nebo HTTP), které kódování se má použít pro zprávy (například text nebo binární soubor) a jaké požadavky na zabezpečení jsou nezbytné (například zabezpečení zpráv SSL (Secure Sockets Layer [SSL] nebo zabezpečení zpráv SOAP). Další informace naleznete v tématu Použití vazeb ke konfiguraci služeb a klientů.

  • Smlouva o poskytování služeb. Kontrakt služby popisuje, jaké funkce koncový bod zveřejňuje klientovi. Kontrakt určuje operace, které může klient volat, formu zprávy a typ vstupních parametrů nebo dat potřebných k volání operace a druh zpracování nebo odpovědi, kterou klient může očekávat. Tři základní typy kontraktů odpovídají základním vzorům výměny zpráv (MEP): datagram (jednosměrný), požadavek/odpověď a duplexní (obousměrný). Kontrakt služby může také využívat kontrakty dat a zpráv, které při přístupu vyžadují konkrétní datové typy a formáty zpráv. Další informace o definování kontraktu služby naleznete v tématu Návrh kontraktů služeb. Upozorňujeme, že klient může být také nutný k implementaci kontraktu definovaného službou, který se nazývá kontrakt zpětného volání, pro příjem zpráv ze služby v duplexním mep. Další informace naleznete v tématu Duplex Services.

Koncový bod pro službu lze zadat buď imperativním způsobem pomocí kódu, nebo deklarativní prostřednictvím konfigurace. Pokud nejsou zadány žádné koncové body, modul runtime poskytuje výchozí koncové body přidáním jednoho výchozího koncového bodu pro každou základní adresu pro každý kontrakt služby implementovaný službou. Definování koncových bodů v kódu obvykle není praktické, protože vazby a adresy nasazené služby se obvykle liší od těch, které se používají při vývoji služby. Obecně je vhodnější definovat koncové body služby pomocí konfigurace místo kódu. Udržování vazby a adresování informací mimo kód jim umožňuje změnit, aniž by bylo nutné aplikaci znovu zkompilovat a znovu nasadit.

Poznámka:

Při přidávání koncového bodu služby, který provádí zosobnění, musíte buď použít jednu z AddServiceEndpoint metod, nebo metodu GetContract(Type, Type) pro správné načtení kontraktu do nového ServiceDescription objektu.

Definování koncových bodů v kódu

Následující příklad ukazuje, jak zadat koncový bod v kódu následujícím způsobem:

  • Definujte kontrakt pro IEcho typ služby, který přijme jméno uživatele a ozvěnu s odpovědí "Hello <name>!".

  • Echo Implementujte službu typu definovaného kontraktemIEcho.

  • Zadejte adresu koncového http://localhost:8000/Echo bodu pro službu.

  • Echo Nakonfigurujte službu pomocí vazbyWSHttpBinding.

namespace Echo
{
   // Define the contract for the IEcho service
   [ServiceContract]
   public interface IEcho
   {
       [OperationContract]
       String Hello(string name)
   }

   // Create an Echo service that implements IEcho contract
   class Echo : IEcho
   {
      public string Hello(string name)
      {
         return "Hello" + name + "!";
      }
      public static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("http://localhost:8000/");

          //Create a ServiceHost for the Echo service.
          ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);

          // Use a predefined WSHttpBinding to configure the service.
          WSHttpBinding binding = new WSHttpBinding();

          // Add the endpoint for this service to the service host.
          serviceHost.AddServiceEndpoint(
             typeof(IEcho),
             binding,
             echoUri
           );

          // Open the service host to run it.
          serviceHost.Open();
     }
  }
}
' Define the contract for the IEcho service
    <ServiceContract()> _
    Public Interface IEcho
        <OperationContract()> _
        Function Hello(ByVal name As String) As String
    End Interface

' Create an Echo service that implements IEcho contract
    Public Class Echo
        Implements IEcho
        Public Function Hello(ByVal name As String) As String _
 Implements ICalculator.Hello
            Dim result As String = "Hello" + name + "!"
            Return result
        End Function

' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("http://localhost:8000/")

' Create a ServiceHost for the Echo service.
Dim svcHost As ServiceHost = New ServiceHost(GetType(HelloWorld), echoUri)

' Use a predefined WSHttpBinding to configure the service.
Dim binding As New WSHttpBinding()

' Add the endpoint for this service to the service host.
serviceHost.AddServiceEndpoint(GetType(IEcho), binding, echoUri)

' Open the service host to run it.
serviceHost.Open()

Poznámka:

Hostitel služby se vytvoří se základní adresou a zbytek adresy vzhledem k základní adrese se zadává jako součást koncového bodu. Toto dělení adresy umožňuje definovat více koncových bodů pro služby na hostiteli.

Poznámka:

ServiceDescription Vlastnosti aplikace služby nesmí být změněny po OnOpening metodě na ServiceHostBase. Některé členy, například Credentials vlastnost a AddServiceEndpoint metody zapnuty ServiceHostBase a ServiceHost, vyvolat výjimku, pokud je změněna v tomto bodu. Ostatní vám umožňují je upravovat, ale výsledek je nedefinovaný.

Podobně v klientovi ServiceEndpoint nesmí být hodnoty změněny po volání OnOpening na ChannelFactorystraně . Vlastnost Credentials vyvolá výjimku, pokud byla změněna v minulosti. Ostatní hodnoty popisu klienta je možné upravit bez chyby, ale výsledek není definován.

Bez ohledu na to, zda je služba nebo klient, doporučujeme před voláním Openupravit popis .

Definování koncových bodů v konfiguraci

Při vytváření aplikace často chcete odložit rozhodnutí správci, který aplikaci nasazuje. Často například neexistuje způsob, jak předem zjistit, jaká bude adresa služby (identifikátor URI). Místo pevně zakódované adresy je vhodnější povolit správci, aby to udělal po vytvoření služby. Tato flexibilita se provádí prostřednictvím konfigurace. Podrobnosti najdete v tématu Konfigurace služeb.

Poznámka:

Pomocí nástroje ServiceModel Metadata Utility (Svcutil.exe) s přepínačem /config:názvu souboru souboru[,] můžete rychle vytvářet konfigurační soubory.

Použití výchozích koncových bodů

Pokud nejsou v kódu nebo v konfiguraci zadány žádné koncové body, modul runtime poskytuje výchozí koncové body přidáním jednoho výchozího koncového bodu pro každou základní adresu pro každou smlouvu služby implementovanou službou. Základní adresu lze zadat v kódu nebo v konfiguraci a výchozí koncové body jsou přidány při Open() zavolání na ServiceHost. Tento příklad je stejný jako v předchozí části, ale protože nejsou zadány žádné koncové body, přidají se výchozí koncové body.

namespace Echo
{
   // Define the contract for the IEcho service
   [ServiceContract]
   public interface IEcho
   {
       [OperationContract]
       String Hello(string name)
   }

   // Create an Echo service that implements IEcho contract
   public class Echo : IEcho
   {
      public string Hello(string name)
      {
         return "Hello" + name + "!";
      }
      public static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("http://localhost:8000/");

          //Create a ServiceHost for the Echo service.
          ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);

          // Open the service host to run it. Default endpoints
          // are added when the service is opened.
          serviceHost.Open();
     }
  }
}
' Define the contract for the IEcho service
    <ServiceContract()> _
    Public Interface IEcho
        <OperationContract()> _
        Function Hello(ByVal name As String) As String
    End Interface

' Create an Echo service that implements IEcho contract
    Public Class Echo
        Implements IEcho
        Public Function Hello(ByVal name As String) As String _
 Implements ICalculator.Hello
            Dim result As String = "Hello" + name + "!"
            Return result
        End Function

' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("http://localhost:8000/")

' Open the service host to run it. Default endpoints
' are added when the service is opened.
serviceHost.Open()

Pokud jsou koncové body explicitně zadané, je možné výchozí koncové body přidat voláním AddDefaultEndpointsServiceHost před voláním Open. Další informace o výchozích koncových bodech naleznete v tématu Zjednodušená konfigurace a Zjednodušená konfigurace pro služby WCF.

Viz také