Dela via


Översikt över skapande av slutpunkt

All kommunikation med en WCF-tjänst (Windows Communication Foundation) sker via tjänstens slutpunkter. Slutpunkter ger klienterna åtkomst till de funktioner som en WCF-tjänst erbjuder. Det här avsnittet beskriver strukturen för en slutpunkt och beskriver hur du definierar en slutpunkt i konfiguration och kod.

Strukturen för en slutpunkt

Varje slutpunkt innehåller en adress som anger var slutpunkten ska hittas, en bindning som anger hur en klient kan kommunicera med slutpunkten och ett kontrakt som identifierar de tillgängliga metoderna.

  • Adress. Adressen identifierar slutpunkten unikt och talar om för potentiella konsumenter var tjänsten finns. Den representeras i WCF-objektmodellen av EndpointAddress adressen, som innehåller en URI (Uniform Resource Identifier) och adressegenskaper som innehåller en identitet, vissa WSDL-element (Web Services Description Language) och en samling valfria rubriker. De valfria rubrikerna innehåller ytterligare detaljerad adressinformation för att identifiera eller interagera med slutpunkten. Mer information finns i Ange en slutpunktsadress.

  • Bindning. Bindningen anger hur du kommunicerar med slutpunkten. Bindningen anger hur slutpunkten kommunicerar med världen, inklusive vilket transportprotokoll som ska användas (till exempel TCP eller HTTP), vilken kodning som ska användas för meddelandena (till exempel text eller binär) och vilka säkerhetskrav som krävs (till exempel Secure Sockets Layer [SSL] eller SOAP-meddelandesäkerhet). Mer information finns i Använda bindningar för att konfigurera tjänster och klienter.

  • Servicekontrakt. Tjänstkontraktet beskriver vilka funktioner slutpunkten exponerar för klienten. Ett kontrakt anger de åtgärder som en klient kan anropa, meddelandets form och vilken typ av indataparametrar eller data som krävs för att anropa åtgärden samt vilken typ av bearbetnings- eller svarsmeddelande som klienten kan förvänta sig. Tre grundläggande typer av kontrakt motsvarar grundläggande mönster för utbyte av meddelanden (Parlamentsledamöter): datagram (enkelriktat), begäran/svar och duplex (dubbelriktat). Tjänstkontraktet kan också använda data- och meddelandekontrakt för att kräva specifika datatyper och meddelandeformat när de används. Mer information om hur du definierar ett tjänstkontrakt finns i Designa tjänstkontrakt. Observera att en klient också kan behöva implementera ett tjänstdefinierat kontrakt, kallat ett återanropskontrakt, för att ta emot meddelanden från tjänsten i en dubbelsidig MEP. Mer information finns i Duplex Services.

Slutpunkten för en tjänst kan anges antingen imperativt med hjälp av kod eller deklarativt via konfiguration. Om inga slutpunkter anges tillhandahåller körningen standardslutpunkter genom att lägga till en standardslutpunkt för varje basadress för varje tjänstkontrakt som implementeras av tjänsten. Det är vanligtvis inte praktiskt att definiera slutpunkter i kod eftersom bindningar och adresser för en distribuerad tjänst vanligtvis skiljer sig från de som används när tjänsten utvecklas. I allmänhet är det mer praktiskt att definiera tjänstslutpunkter med hjälp av konfiguration i stället för kod. Genom att hålla bindnings- och adressinformationen borta från koden kan de ändras utan att behöva omkompilera och distribuera om programmet.

Kommentar

När du lägger till en tjänstslutpunkt som utför personifiering måste du antingen använda någon av AddServiceEndpoint metoderna eller GetContract(Type, Type) metoden för att korrekt läsa in kontraktet i ett nytt ServiceDescription objekt.

Definiera slutpunkter i kod

I följande exempel visas hur du anger en slutpunkt i kod med följande:

  • Definiera ett kontrakt för en IEcho typ av tjänst som accepterar någons namn och eko med svaret "Hello <name>!".

  • Implementera en Echo tjänst av den typ som definieras av IEcho kontraktet.

  • Ange en slutpunktsadress http://localhost:8000/Echo för tjänsten.

  • Konfigurera tjänsten Echo med hjälp av en WSHttpBinding bindning.

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

Kommentar

Tjänstvärden skapas med en basadress och sedan anges resten av adressen, i förhållande till basadressen, som en del av en slutpunkt. Med den här partitioneringen av adressen kan flera slutpunkter definieras enklare för tjänster på en värd.

Kommentar

ServiceDescription Egenskaper för i tjänstprogrammet får inte ändras efter -metoden på OnOpeningServiceHostBase. Vissa medlemmar, till exempel Credentials egenskapen och AddServiceEndpoint metoderna på ServiceHostBase och ServiceHost, utlöser ett undantag om de ändras efter den punkten. Andra tillåter att du ändrar dem, men resultatet är odefinierat.

På samma sätt får värdena på klienten ServiceEndpoint inte ändras efter anropet till OnOpeningChannelFactory. Egenskapen Credentials utlöser ett undantag om det ändras efter den punkten. De andra klientbeskrivningsvärdena kan ändras utan fel, men resultatet är odefinierat.

Oavsett om det gäller tjänsten eller klienten rekommenderar vi att du ändrar beskrivningen innan du anropar Open.

Definiera slutpunkter i konfigurationen

När du skapar ett program vill du ofta skjuta upp beslut till administratören som distribuerar programmet. Det finns till exempel ofta inget sätt att veta i förväg vad en tjänstadress (en URI) kommer att vara. I stället för att hårdkoda en adress är det bättre att låta en administratör göra det när en tjänst har skapats. Den här flexibiliteten uppnås genom konfiguration. Mer information finns i Konfigurera tjänster.

Kommentar

Använd verktyget ServiceModel-metadataverktyg (Svcutil.exe) med/config: filnamnets[,filnamnsväxel] för att snabbt skapa konfigurationsfiler.

Använda standardslutpunkter

Om inga slutpunkter anges i kod eller i konfigurationen tillhandahåller körningen standardslutpunkter genom att lägga till en standardslutpunkt för varje basadress för varje tjänstkontrakt som implementeras av tjänsten. Basadressen kan anges i kod eller i konfigurationen, och standardslutpunkterna läggs till när Open() anropas på ServiceHost. Det här exemplet är samma exempel från föregående avsnitt, men eftersom inga slutpunkter har angetts läggs standardslutpunkterna till.

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

Om slutpunkter uttryckligen anges kan standardslutpunkterna fortfarande läggas till genom att anropa AddDefaultEndpoints innan du ServiceHost anropar Open. Mer information om standardslutpunkter finns i Förenklad konfiguration och förenklad konfiguration för WCF-tjänster.

Se även