Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Tutte le comunicazioni con un servizio Windows Communication Foundation (WCF) vengono eseguite tramite gli endpoint del servizio. Gli endpoint forniscono ai client l'accesso alle funzionalità offerte da un servizio WCF. Questa sezione descrive la struttura di un endpoint e descrive come definire un endpoint nella configurazione e nel codice.
Struttura di un endpoint
Ogni endpoint contiene un indirizzo che indica dove trovare l'endpoint, un'associazione che specifica come un client può comunicare con l'endpoint e un contratto che identifica i metodi disponibili.
Indirizzo. L'indirizzo identifica in modo univoco l'endpoint e indica ai potenziali consumer dove si trova il servizio. Viene rappresentato nel modello a oggetti WCF dall'indirizzo EndpointAddress , che contiene un URI (Uniform Resource Identifier) e le proprietà dell'indirizzo che includono un'identità, alcuni elementi WSDL (Web Services Description Language) e una raccolta di intestazioni facoltative. Le intestazioni facoltative forniscono ulteriori dettagli sull'indirizzamento per identificare o interagire con l'endpoint. Per altre informazioni, vedere Specifica di un indirizzo endpoint.
Associazione. Il vincolo specifica il modo in cui comunicare con l'endpoint. L'associazione specifica il modo in cui l'endpoint comunica con il mondo, incluso il protocollo di trasporto da usare (ad esempio TCP o HTTP), che codifica da usare per i messaggi (ad esempio, testo o binario) e quali requisiti di sicurezza sono necessari (ad esempio, Secure Sockets Layer [SSL] o sicurezza dei messaggi SOAP). Per altre informazioni, vedere Uso di associazioni per configurare servizi e client.
Contratto di servizio. Il contratto di servizio descrive le funzionalità esposte dall'endpoint al client. Un contratto specifica le operazioni che un client può chiamare, il formato del messaggio e il tipo di parametri di input o dati necessari per chiamare l'operazione e il tipo di elaborazione o messaggio di risposta che il client può aspettarsi. Tre tipi di contratti di base corrispondono ai modelli di scambio di messaggi di base( MEP): datagram (unidirezionale), richiesta/risposta e duplex (bidirezionale). Il contratto di servizio può anche usare contratti di dati e messaggi per richiedere tipi di dati e formati di messaggio specifici quando si accede. Per altre informazioni su come definire un contratto di servizio, vedere Progettazione di contratti di servizio. Si noti che un client può anche dover implementare un contratto definito dal servizio, denominato contratto di callback, per ricevere messaggi dal servizio in un meccanismo di scambio di messaggi duplex (MEP). Per altre informazioni, vedere Servizi duplex.
L'endpoint per un servizio può essere specificato in modo imperativo usando il codice o in modo dichiarativo tramite la configurazione. Se non vengono specificati endpoint, il runtime fornisce endpoint predefiniti aggiungendo un endpoint predefinito per ogni indirizzo di base per ogni contratto di servizio implementato dal servizio. La definizione degli endpoint nel codice in genere non è pratica perché le associazioni e gli indirizzi per un servizio distribuito sono in genere diversi da quelli usati durante lo sviluppo del servizio. In genere, è più pratico definire gli endpoint di servizio usando la configurazione anziché il codice. Mantenere le informazioni di associazione e indirizzamento separate dal codice consente di modificarle senza dover ricompilare e ridistribuire l'applicazione.
Annotazioni
Quando si aggiunge un endpoint di servizio che esegue l'impersonificazione, dovresti utilizzare uno dei metodi AddServiceEndpoint o il metodo GetContract(Type, Type) per caricare correttamente il contratto in un nuovo oggetto ServiceDescription.
Definizione di endpoint nel codice
Nell'esempio seguente viene illustrato come specificare un endpoint nel codice con quanto segue:
Definire un contratto per un
IEchotipo di servizio che accetta il nome di una persona e restituisce la risposta "Hello <name>!".Implementare un
Echoservizio del tipo definito dalIEchocontratto.Specificare un indirizzo endpoint di
http://localhost:8000/Echoper il servizio.Configura il servizio
Echousando un'associazione WSHttpBinding.
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()
Annotazioni
L'host del servizio viene creato con un indirizzo di base e quindi il resto dell'indirizzo, relativo all'indirizzo di base, viene specificato come parte di un endpoint. Questo partizionamento dell'indirizzo consente di definire più endpoint in modo più pratico per i servizi in un host.
Annotazioni
Le proprietà di ServiceDescription nell'applicazione di servizio non devono essere modificate successivamente al OnOpening metodo in ServiceHostBase. Alcuni membri, ad esempio la Credentials proprietà e i AddServiceEndpoint metodi in ServiceHostBase e ServiceHost, generano un'eccezione se modificati dopo tale punto. Altri consentono di modificarli, ma il risultato non è definito.
Analogamente, i valori ServiceEndpoint sul client non devono essere modificati dopo la chiamata a OnOpening su ChannelFactory. La Credentials proprietà genera un'eccezione se è stata modificata dopo tale punto. Gli altri valori di descrizione client possono essere modificati senza errori, ma il risultato non è definito.
Sia per il servizio che per il client, è consigliabile modificare la descrizione prima di chiamare Open.
Definizione degli endpoint nella configurazione
Quando si crea un'applicazione, spesso si vogliono rinviare le decisioni all'amministratore che sta distribuendo l'applicazione. Ad esempio, spesso non è possibile sapere in anticipo quale sarà l'indirizzo di un servizio (un URI). Invece di codificare manualmente un indirizzo, è preferibile consentire a un amministratore di farlo dopo aver creato un servizio. Questa flessibilità viene ottenuta tramite la configurazione. Per informazioni dettagliate, vedere Configurazione dei servizi.
Annotazioni
Usare lo Strumento di Utilità Metadati ServiceModel (Svcutil.exe) con l'opzione di comando /config:filename[,filename] per creare rapidamente i file di configurazione.
Uso degli endpoint predefiniti
Se nel codice o nella configurazione non sono specificati endpoint, il runtime fornisce endpoint predefiniti aggiungendo un endpoint predefinito per ogni indirizzo di base per ogni contratto di servizio implementato dal servizio. L'indirizzo di base può essere specificato nel codice o nella configurazione e gli endpoint predefiniti vengono aggiunti quando Open() viene chiamato su ServiceHost. Questo esempio è lo stesso esempio della sezione precedente, ma poiché non vengono specificati endpoint, vengono aggiunti gli endpoint predefiniti.
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 gli endpoint vengono forniti in modo esplicito, gli endpoint predefiniti possono comunque essere aggiunti chiamando AddDefaultEndpoints su ServiceHost prima di chiamare Open. Per altre informazioni sugli endpoint predefiniti, vedere Configurazione semplificata e Configurazione semplificata per i servizi WCF.