Cenni preliminari sulla creazione di endpointEndpoint Creation Overview

Tutte le comunicazioni con un servizio Windows Communication Foundation (WCF) avvengono tramite gli endpoint del servizio.All communication with a Windows Communication Foundation (WCF) service occurs through the endpoints of the service. Gli endpoint forniscono ai client l'accesso alla funzionalità offerta da un servizio WCF.Endpoints provide the clients access to the functionality that a WCF service offers. Questa sezione descrive la struttura di un endpoint e viene illustrato come definire un endpoint nella configurazione e nel codice.This section describes the structure of an endpoint and outlines how to define an endpoint in configuration and in code.

Struttura di un endpointThe Structure of an Endpoint

Ogni endpoint contiene un indirizzo che indica dove individuare l'endpoint, un'associazione che specifica in che modo un client può comunicare con l'endpoint e un contratto che identifica i metodi disponibili.Each endpoint contains an address that indicates where to find the endpoint, a binding that specifies how a client can communicate with the endpoint, and a contract that identifies the methods available.

  • Indirizzo.Address. L'indirizzo identifica in modo univoco l'endpoint e comunica ai potenziali utenti l'ubicazione del servizio.The address uniquely identifies the endpoint and tells potential consumers where the service is located. Viene rappresentata nel modello a oggetti WCF dall'indirizzo del EndpointAddress, che contiene una Uniform Resource Identifier (URI) e le proprietà dell'indirizzo che includono un'identità, alcuni elementi Web Services Description Language (WSDL) e una raccolta di intestazioni facoltative.It is represented in the WCF object model by the EndpointAddress address, which contains a Uniform Resource Identifier (URI) and address properties that include an identity, some Web Services Description Language (WSDL) elements, and a collection of optional headers. Le intestazioni facoltative forniscono dettagli aggiuntivi sull'indirizzo per identificare o interagire con l'endpoint.The optional headers provide additional detailed addressing information to identify or interact with the endpoint. Per ulteriori informazioni, vedere specifica di un indirizzo endpoint.For more information, see Specifying an Endpoint Address.

  • Associazione.Binding. L'associazione specifica la modalità di comunicazione con l'endpoint.The binding specifies how to communicate with the endpoint. L'associazione specifica in che modo l'endpoint comunica con il mondo, incluso il protocollo di trasporto da usare (ad esempio, TCP o HTTP), il tipo di codifica da usare per i messaggi (ad esempio, testo o binaria) e i requisiti di sicurezza necessari (ad esempio, Secure Sockets Layer [SSL] o sicurezza dei messaggi SOAP).The binding specifies how the endpoint communicates with the world, including which transport protocol to use (for example, TCP or HTTP), which encoding to use for the messages (for example, text or binary), and which security requirements are necessary (for example, Secure Sockets Layer [SSL] or SOAP message security). Per ulteriori informazioni, vedere utilizzo delle associazioni per configurare servizi e client.For more information, see Using Bindings to Configure Services and Clients.

  • Contratto di servizio.Service contract. Il contratto di servizio delinea la funzionalità che l'endpoint espone al client.The service contract outlines what functionality the endpoint exposes to the client. Un contratto specifica le operazioni che un client può richiamare, il modulo del messaggio e il tipo di parametri o dati di input necessari per chiamare l'operazione e il tipo di elaborazione o messaggio di risposta che il client può aspettarsi.A contract specifies the operations that a client can call, the form of the message and the type of input parameters or data required to call the operation, and the kind of processing or response message the client can expect. Tre tipi di contratti di base corrispondono a modelli di scambio dei messaggi (MEP, Message Exchange Pattern) di base: datagramma (unidirezionale), request/reply e duplex (bidirezionale).Three basic types of contracts correspond to basic message exchange patterns (MEPs): datagram (one-way), request/reply, and duplex (bidirectional). Il contratto di servizio può inoltre usare contratti dati e contratti di messaggio per richiedere tipi di dati e formati di messaggio specifici al momento dell'accesso.The service contract can also employ data and message contracts to require specific data types and message formats when being accessed. Per ulteriori informazioni su come definire un contratto di servizio, vedere progettazione di contratti di servizio.For more information about how to define a service contract, see Designing Service Contracts. Per ricevere messaggi dal servizio in un modello di scambio dei messaggi (MEP) duplex, è possibile che un client debba implementare un contratto definito dal servizio, detto contratto di callback.Note that a client may also be required to implement a service-defined contract, called a callback contract, to receive messages from the service in a duplex MEP. Per ulteriori informazioni, vedere servizi duplex.For more information, see Duplex Services.

L'endpoint per un servizio può essere specificato in modo imperativo mediante l'uso di codice oppure in modo dichiarativo mediante la configurazione.The endpoint for a service can be specified either imperatively by using code or declaratively through configuration. Se non è specificato alcun endpoint, il runtime ne fornisce di predefiniti aggiungendone uno per ogni indirizzo di base per ciascun contratto di servizio implementato dal servizio.If no endpoints are specified then the runtime provides default endpoints by adding one default endpoint for each base address for each service contract implemented by the service. In genere definire endpoint nel codice non è pratico in quanto le associazioni e gli indirizzi di un servizio distribuito sono solitamente diversi da quelli usati durante lo sviluppo del servizio.Defining endpoints in code is usually not practical because the bindings and addresses for a deployed service are typically different from those used while the service is being developed. In genere è più pratico definire endpoint di servizio mediante la configurazione piuttosto che mediante codice.Generally, it is more practical to define service endpoints using configuration rather than code. Se le informazioni sull'associazione e sull'indirizzo non vengono incluse nel codice, tali dati possono essere modificati senza dover compilare e distribuire nuovamente l'applicazione.Keeping the binding and addressing information out of the code allows them to change without having to recompile and redeploy the application.

Nota

Quando si aggiunge un endpoint di servizio che esegue la rappresentazione, è necessario usare uno dei metodi AddServiceEndpoint o il metodo GetContract(Type, Type) per caricare correttamente il contratto in un nuovo oggetto ServiceDescription.When adding a service endpoint that performs impersonation, you must either use one of the AddServiceEndpoint methods or the GetContract(Type, Type) method to properly load the contract into a new ServiceDescription object.

Definizione di endpoint nel codiceDefining Endpoints in Code

Nell'esempio riportato di seguito viene illustrato come specificare un endpoint nel codice.The following example illustrates how to specify an endpoint in code with the following:

  • Definire un contratto per un tipo di servizio IEcho che accetti il nome e l'Echo di un utente con la risposta "Hello <name >!".Define a contract for an IEcho type of service that accepts someone's name and echo with the response "Hello <name>!".

  • Implementare un servizio Echo del tipo definito dal contratto IEcho.Implement an Echo service of the type defined by the IEcho contract.

  • Specificare un indirizzo endpoint di http://localhost:8000/Echo per il servizio.Specify an endpoint address of http://localhost:8000/Echo for the service.

  • Configurare il servizio Echo usando un'associazione WSHttpBinding.Configure the Echo service using a WSHttpBinding binding.

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

Nota

L'host del servizio viene creato con un indirizzo di base. Il resto dell'indirizzo, relativo all'indirizzo di base, viene quindi specificato come parte di un endpoint.The service host is created with a base address and then the rest of the address, relative to the base address, is specified as part of an endpoint. Questo partizionamento dell'indirizzo consente a più endpoint di essere definiti in modo più appropriato per i servizi presenti in un host.This partitioning of the address allows multiple endpoints to be defined more conveniently for services at a host.

Nota

Le proprietà di ServiceDescription nell'applicazione del servizio non devono essere modificate dopo la chiamata al metodo OnOpening su ServiceHostBase.Properties of ServiceDescription in the service application must not be modified subsequent to the OnOpening method on ServiceHostBase. Se vengono modificati dopo questo punto, alcuni membri, ad esempio la proprietà Credentials e i metodi AddServiceEndpoint su ServiceHostBase e ServiceHost, generano un'eccezione.Some members, such as the Credentials property and the AddServiceEndpoint methods on ServiceHostBase and ServiceHost, throw an exception if modified past that point. Altri consentono la modifica, ma il risultato è indefinito.Others permit you to modify them, but the result is undefined.

Analogamente, sul client i valori ServiceEndpoint non devono essere modificati dopo la chiamata a OnOpening su ChannelFactory.Similarly, on the client the ServiceEndpoint values must not be modified after the call to OnOpening on the ChannelFactory. Se viene modificata dopo questo punto, la proprietà Credentials genera un'eccezione.The Credentials property throws an exception if modified past that point. Gli altri valori della descrizione client possono essere modificati senza errore, ma il risultato è indefinito.The other client description values can be modified without error, but the result is undefined.

Per il servizio o per il client, è consigliabile modificare la descrizione prima di chiamare Open.Whether for the service or client, it is recommended that you modify the description prior to calling Open.

Definizione di endpoint nella configurazioneDefining Endpoints in Configuration

Durante la creazione di un'applicazione è spesso necessario rimettere le decisioni all'amministratore che distribuisce l'applicazione.When creating an application, you often want to defer decisions to the administrator who is deploying the application. Spesso non è possibile prevedere, ad esempio, quale sarà l'indirizzo (URI) di un servizio.For example, there is often no way of knowing in advance what a service address (a URI) will be. Anziché inserire un indirizzo nel codice, è preferibile consentire che questa operazione venga eseguita da un amministratore dopo la creazione del servizio.Instead of hard-coding an address, it is preferable to allow an administrator to do so after creating a service. Questa flessibilità viene realizzata attraverso la configurazione.This flexibility is accomplished through configuration. Per informazioni dettagliate, vedere configurazione dei servizi.For details, see Configuring Services.

Nota

Utilizzare lo strumento ServiceModel Metadata Utility Tool (Svcutil. exe) con il /config:filename [,filename ] opzione per creare rapidamente file di configurazione.Use the ServiceModel Metadata Utility Tool (Svcutil.exe) with the /config:filename[,filename] switch to quickly create configuration files.

Uso di endpoint predefinitiUsing Default Endpoints

Se non è specificato alcun endpoint nel codice o nella configurazione, il runtime ne fornisce di predefiniti aggiungendone uno per ogni indirizzo di base per ciascun contratto di servizio implementato dal servizio.If no endpoints are specified in code or in configuration then the runtime provides default endpoints by adding one default endpoint for each base address for each service contract implemented by the service. L'indirizzo di base può essere specificato nel codice o nella configurazione e gli endpoint predefiniti vengono aggiunti quando viene chiamato Open() in ServiceHost.The base address can be specified in code or in configuration, and the default endpoints are added when Open() is called on the ServiceHost. Questo esempio è identico a quello della sezione precedente, ma poiché non è stato specificato alcun endpoint, vengono aggiunti gli endpoint predefiniti.This example is the same example from the previous section, but since no endpoints are specified, the default endpoints are added.

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

Se vengono forniti endpoint in modo esplicito, è comunque possibile aggiungere gli endpoint predefiniti chiamando AddDefaultEndpoints su ServiceHost prima di chiamare Open.If endpoints are explicitly provided, the default endpoints can still be added by calling AddDefaultEndpoints on the ServiceHost before calling Open. Per ulteriori informazioni sugli endpoint predefiniti, vedere Configurazione semplificata e Configurazione semplificata per i servizi WCF.For more information about default endpoints, see Simplified Configuration and Simplified Configuration for WCF Services.

Vedere ancheSee also