Przegląd tworzenia punktów końcowych

Cała komunikacja z usługą Windows Communication Foundation (WCF) odbywa się za pośrednictwem punktów końcowych usługi. Punkty końcowe zapewniają klientom dostęp do funkcji, które oferuje usługa WCF. W tej sekcji opisano strukturę punktu końcowego i opisano sposób definiowania punktu końcowego w konfiguracji i w kodzie.

Struktura punktu końcowego

Każdy punkt końcowy zawiera adres, który wskazuje, gdzie znaleźć punkt końcowy, powiązanie określające, w jaki sposób klient może komunikować się z punktem końcowym, oraz kontrakt identyfikujący dostępne metody.

  • Adres. Adres jednoznacznie identyfikuje punkt końcowy i informuje potencjalnych użytkowników, gdzie znajduje się usługa. Jest reprezentowany w modelu obiektów WCF według EndpointAddress adresu, który zawiera identyfikator URI (Uniform Resource Identifier) i właściwości adresu, które zawierają tożsamość, niektóre elementy języka WSDL (Web Services Description Language) i kolekcję opcjonalnych nagłówków. Opcjonalne nagłówki zawierają dodatkowe szczegółowe informacje dotyczące adresowania w celu zidentyfikowania punktu końcowego lub interakcji z nim. Aby uzyskać więcej informacji, zobacz Określanie adresu punktu końcowego.

  • Wiązanie. Powiązanie określa, jak komunikować się z punktem końcowym. Powiązanie określa, w jaki sposób punkt końcowy komunikuje się ze światem, w tym z protokołem transportu do użycia (na przykład TCP lub HTTP), które kodowanie ma być używane dla komunikatów (na przykład tekst lub plik binarny) i które wymagania dotyczące zabezpieczeń są niezbędne (na przykład zabezpieczenia protokołu Secure Sockets Layer [SSL] lub protokołu SOAP). Aby uzyskać więcej informacji, zobacz Using Bindings to Configure Services and Clients (Używanie powiązań do konfigurowania usług i klientów).

  • Kontrakt usługi. Kontrakt usługi przedstawia funkcjonalność, jaką punkt końcowy uwidacznia klientowi. Kontrakt określa operacje, które klient może wywołać, postać komunikatu i typ parametrów wejściowych lub danych wymaganych do wywołania operacji, oraz rodzaj przetwarzania lub komunikatu odpowiedzi, którego klient może oczekiwać. Trzy podstawowe typy kontraktów odpowiadają podstawowym wzorom wymiany komunikatów (deputowanym): datagram (jednokierunkowy), żądanie/odpowiedź i dwukierunkowy (dwukierunkowy). Kontrakt usługi może również używać kontraktów danych i komunikatów, aby wymagać określonych typów danych i formatów komunikatów podczas uzyskiwania dostępu. Aby uzyskać więcej informacji na temat definiowania kontraktu usługi, zobacz Projektowanie kontraktów usług. Należy pamiętać, że klient może być również wymagany do zaimplementowania kontraktu zdefiniowanego przez usługę, nazywanego kontraktem wywołania zwrotnego, w celu odbierania komunikatów z usługi w dwudupleksowym mepcie. Aby uzyskać więcej informacji, zobacz Usługi dwustronne.

Punkt końcowy usługi można określić w sposób imperatywne przy użyciu kodu lub deklaratywnie za pośrednictwem konfiguracji. Jeśli nie określono żadnych punktów końcowych, środowisko uruchomieniowe udostępnia domyślne punkty końcowe przez dodanie jednego domyślnego punktu końcowego dla każdego adresu podstawowego dla każdego kontraktu usługi zaimplementowanego przez usługę. Definiowanie punktów końcowych w kodzie zwykle nie jest praktyczne, ponieważ powiązania i adresy wdrożonej usługi zwykle różnią się od tych używanych podczas opracowywania usługi. Ogólnie rzecz biorąc, bardziej praktyczne jest definiowanie punktów końcowych usługi przy użyciu konfiguracji, a nie kodu. Utrzymywanie powiązania i adresowania informacji poza kodem umożliwia ich zmianę bez konieczności ponownego kompilowania i ponownego wdrażania aplikacji.

Uwaga

Podczas dodawania punktu końcowego usługi, który wykonuje personifikację, należy użyć jednej z AddServiceEndpoint metod lub GetContract(Type, Type) metody, aby prawidłowo załadować kontrakt do nowego ServiceDescription obiektu.

Definiowanie punktów końcowych w kodzie

Poniższy przykład ilustruje sposób określania punktu końcowego w kodzie przy użyciu następujących elementów:

  • Zdefiniuj kontrakt dla IEcho typu usługi, która akceptuje nazwę i echo osoby z odpowiedzią "Hello <name>!".

  • Zaimplementuj usługę Echo typu zdefiniowanego IEcho przez kontrakt.

  • Określ adres punktu końcowego http://localhost:8000/Echo dla usługi.

  • Skonfiguruj usługę EchoWSHttpBinding przy użyciu powiązania.

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

Uwaga

Host usługi jest tworzony przy użyciu adresu podstawowego, a następnie pozostałe adresy względem adresu podstawowego są określane jako część punktu końcowego. To partycjonowanie adresu umożliwia bardziej wygodne definiowanie wielu punktów końcowych dla usług na hoście.

Uwaga

ServiceDescription Właściwości w aplikacji usługi nie mogą być modyfikowane po metodzie OnOpening w pliku ServiceHostBase. Niektóre elementy członkowskie, takie jak Credentials właściwość i AddServiceEndpoint metody w systemach ServiceHostBase i ServiceHost, zgłaszają wyjątek w przypadku zmodyfikowania przeszłości tego punktu. Inni zezwalają na ich modyfikowanie, ale wynik jest niezdefiniowany.

Podobnie na kliencie ServiceEndpoint wartości nie mogą być modyfikowane po wywołaniu OnOpeningChannelFactorymetody na . Właściwość Credentials zgłasza wyjątek, jeśli został zmodyfikowany obok tego punktu. Inne wartości opisu klienta można modyfikować bez błędu, ale wynik jest niezdefiniowany.

Niezależnie od tego, czy jest to usługa, czy klient, zaleca się zmodyfikowanie opisu przed wywołaniem metody Open.

Definiowanie punktów końcowych w konfiguracji

Podczas tworzenia aplikacji często chcesz odroczyć decyzje administratora, który wdraża aplikację. Na przykład często nie ma możliwości wcześniejszego poznania, jaki będzie adres usługi (identyfikator URI). Zamiast trwale kodować adres, lepiej jest zezwolić administratorowi na to po utworzeniu usługi. Ta elastyczność jest osiągana przez konfigurację. Aby uzyskać szczegółowe informacje, zobacz Konfigurowanie usług.

Uwaga

Użyj narzędzia ServiceModel Metadata Tool (Svcutil.exe) z przełącznikiem /config:nazwy pliku[,], aby szybko utworzyć pliki konfiguracji.

Używanie domyślnych punktów końcowych

Jeśli w kodzie lub w konfiguracji nie określono żadnych punktów końcowych, środowisko uruchomieniowe udostępnia domyślne punkty końcowe przez dodanie jednego domyślnego punktu końcowego dla każdego adresu podstawowego dla każdego kontraktu usługi zaimplementowanego przez usługę. Adres podstawowy można określić w kodzie lub w konfiguracji, a domyślne punkty końcowe są dodawane, gdy Open() jest wywoływany ServiceHostna . Ten przykład jest tym samym przykładem z poprzedniej sekcji, ale ponieważ nie określono żadnych punktów końcowych, domyślne punkty końcowe są dodawane.

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

Jeśli punkty końcowe są jawnie udostępniane, domyślne punkty końcowe mogą być nadal dodawane przez wywołanie metody przed ServiceHost wywołaniem AddDefaultEndpoints metody Open. Aby uzyskać więcej informacji na temat domyślnych punktów końcowych, zobacz Uproszczona konfiguracja i Uproszczona konfiguracja dla usług WCF.

Zobacz też