Passaggio 3: Implementare la connessione per Echo Adapter
Tempo di completamento: 45 minuti
In questo passaggio si implementa la funzionalità di connessione dell'adapter Echo. In base a WCF LOB Adapter SDK, è necessario implementare la classe astratta e le interfacce seguenti durante la connessione al sistema di destinazione.
Microsoft.ServiceModel.Channels.Common.ConnectionUri
Microsoft.ServiceModel.Channels.Common.IConnection
Microsoft.ServiceModel.Channels.Common.IConnectionFactory
Anziché derivare dalla classe e dalle interfacce astratte precedenti, la Creazione guidata adapter genera automaticamente le tre classi derivate, EchoAdapterConnection, EchoAdapterConnectionUri e EchoAdapterConnectionFactory. Oltre a creare le classi, ogni classe ha un metodo predefinito che genera un'eccezione specifica,
System.NotImplementedException
. Questa istruzione ricorda allo sviluppatore di implementare ogni classe. Quando la classe viene implementata, questa istruzione di generazione di eccezioni deve essere rimossa.Nella sezione seguente si aggiornano queste tre classi per comprendere meglio come gestire una connessione, qual è la struttura dell'URI e come recuperare a livello di codice vari elementi URI e quindi usare tali elementi all'interno dell'adapter.
Prerequisiti
Prima di iniziare questo passaggio, è necessario aver completato correttamente il passaggio 2: Classificare le proprietà dell'adapter e della connessione. E si dovrebbe avere una chiara comprensione delle Microsoft.ServiceModel.Channels.Common.IConnection
classi , Microsoft.ServiceModel.Channels.Common.IConnectionFactory
e Microsoft.ServiceModel.Channels.Common.ConnectionUri
.
classi Connection-Related
La Creazione guidata adapter genera tre classi derivate, EchoAdapterConnection, EchoAdapterConnectionUri e EchoAdapterConnectionFactory. Di seguito viene fornita una breve panoramica dei metodi associati a ognuno di essi.
EchoAdapterConnection
A seconda della complessità dell'adattatore, potrebbe essere necessario implementare tutti i cinque metodi seguenti. Per l'adattatore Echo, la maggior parte non è supportata, perché l'esempio di adattatore Echo non prevede alcun sistema di destinazione.
Metodo | Descrizione |
---|---|
public void Close(TimeSpan timeout) | Chiude la connessione al sistema di destinazione. L'adapter Echo usa questo metodo per aggiungere solo eventi di traccia al listener di traccia. |
public bool IsValid(TimeSpan timeout) | Restituisce un valore che indica se la connessione è ancora valida. Non supportato dall'adattatore Echo. |
public void Open(TimeSpan timeout) | Apre la connessione al sistema di destinazione. N/D per l'adattatore Echo. L'esempio mostra tuttavia come usare un elemento URI denominato enableAuthentication per richiedere agli utenti di specificare un nome utente. |
public void ClearContext() | Cancella il contesto della connessione. Questo metodo viene chiamato quando la connessione viene impostata di nuovo sul pool di connessioni. Non supportato dall'adattatore Echo. |
public void Abort() | Interrompe la connessione al sistema di destinazione. Non supportato dall'adattatore Echo. |
EchoAdapterConnectionFactory
La factory di connessione è responsabile della creazione della connessione. Per impostazione predefinita, è necessario modificare questa classe solo quando ci si connette a un sistema di destinazione. Anche se l'adattatore Echo non include alcun sistema di destinazione, viene illustrato come usare un elemento URI personalizzato denominato enableAuthentication se la connessione richiede l'autenticazione utente.
Nota
EnableAuthentication non è una parola chiave, ma solo un nome di variabile. Di conseguenza, è possibile scegliere qualsiasi nome per esso.
EchoAdapterConnectionUri
Rappresenta un stringa di connessione al sistema di destinazione.
Metodo | Descrizione |
---|---|
public override Uri | Ottiene e imposta l'URI. Ottiene per compilare la stringa Uri e imposta per analizzare la stringa URI. |
public EchoAdapterConnectionUri() | Inizializza una nuova istanza della classe ConnectionUri. |
public override string SampleUriString | Restituisce EchoAdapter.SCHEME + "://{nome host}/{application}?enableAuthentication={True|False}". Questa stringa restituita viene visualizzata come Esempio nello strumento Plug-in Di riferimento del servizio adattatore, come illustrato nella figura seguente. |
URI di connessione dell'adapter Echo
L'URI di connessione dell'adattatore Echo di esempio è descritto come EchoAapter.SCHEME://{nome host}/{application}?enableAuthentication={true|false}
Poiché EchoAapter.SCHEME è echov2, l'URI di connessione è:
echo2://lobhostname/lobapplication?enableAuthentication={true|false}
È possibile leggere l'URI di connessione precedente quando enableAuthentication=false come indicato di seguito:
Usando lo schema di trasporto echov2, passare a un computer denominato lobhostname, in cui un'applicazione denominata lobapplication che non richiede alcuna autenticazione è in attesa della connessione.
In alternativa, quando enableAuthentication=true, leggere la connessione come segue:
Usando lo schema di trasporto echov2, passare a un computer denominato lobhostname, in cui un'applicazione denominata lobapplication prevede che l'autenticazione sia in attesa della connessione. Per l'adattatore Echo, è necessario solo un nome utente.
Con un URI definito, è possibile utilizzarlo e analizzarlo a livello di codice per la connettività e la configurazione. Se la connessione richiede dati sensibili, ad esempio un nome utente e una password, non contengono tali informazioni nell'URI. Aggiungere invece tali informazioni nell'oggetto System.ServiceModel.Description.ClientCredentials
. L'esempio di codice aggiunto illustra come eseguire questa operazione.
Nel codice seguente, l'adattatore Echo costruisce l'URI in due modi per mostrare come l'adattatore può usare vari elementi URI per modificare la funzionalità dell'adattatore.
echo2://lobhostname/lobapplication?enableAuthentication=[true|false]
echo2://lobhostname/lobapplication?enableAuthentication=[true|false]&echoInUpperCase=true
Recupero dell'elemento URI
È possibile analizzare ogni elemento URI nell'URI dell'adattatore Echo echo2://lobhostname/lobapplication?enableAuthentication=false&echoInUpperCase=false. I valori degli elementi URI e i metodi associati sono elencati nella tabella seguente:
Valore dell'elemento URI | Metodo |
---|---|
lobhostname | System.Uri.Host%2A per recuperare il nome host |
Lobapplication | System.Uri.AbsolutePath%2A per recuperare il nome dell'applicazione di destinazione |
enableAuthentation=false | GetQueryStringValue("enableAuthentication") Usare questo elemento URI per convalidare le credenziali utente Nota: GetQueryStringValue è un metodo statico definito in Microsoft.ServiceModel.Channels.Common.ConnectionUri |
echoInUpperValue=false | GetQueryStringValue("echoInUpperValue") Utilizzare questo elemento URI per convertire la stringa in ingresso in lettere maiuscole. |
Elemento EnableAuthentication URI
Il sistema di destinazione richiede spesso di fornire le credenziali client per stabilire una connessione al sistema di destinazione. Come accennato, l'adattatore Echo non comporta alcun sistema di destinazione. Anche se come esempio viene illustrato come usare un elemento URI personalizzato denominato enableAuthentication per fornire le credenziali.
public class EchoAdapterConnection : IConnection
{
….
public void Open(TimeSpan timeout)
{
// only validate the credentials if EnableAuthentication
// connection property value is true
if (this.ConnectionFactory.ConnectionUri.EnableAuthentication)
{
// this adapter expects a value in username
if (this.connectionFactory.ClientCredentials != null &&
string.IsNullOrEmpty(this.connectionFactory.ClientCredentials.UserName.UserName))
{
throw new CredentialsException("Username is expected.");
}
}
}
Il codice verifica se enableAuthentication è true e se non viene specificato un nome utente; se non viene specificato un nome utente, viene generata un'eccezione, rilevata dallo strumento Plug-in Di riferimento del servizio adattatori, come illustrato di seguito:
Per specificare il nome utente, è possibile immetterlo nella finestra di dialogo Configura adattatore nello strumento Plug-in Aggiungi riferimento al servizio adapter, come illustrato nella figura seguente:
Elemento EchoInUpperCase URI
È possibile fare riferimento all'elemento URI EchoInUpperCase come un flag booleano. Se il flag è true, l'adattatore converte la stringa di input dell'operazione EchoStrings in lettere maiuscole.
Per modificare il valore predefinito dell'elemento URI echoInUpperCase, usare la scheda Proprietà URI del plug-in Configura adattatore nel plug-in Aggiungi riferimento al servizio adapter, come illustrato di seguito.
Aggiornamento di EchoAdapterConnection
Si implementa il metodo IsValid, Open e Close della classe EchoAdapterConnection.
Per aggiornare la classe EchoAdapterConnection
In Esplora soluzioni fare doppio clic sul file EchoAdapterConnection.cs.
Nell'editor di Visual Studio fare clic con il pulsante destro del mouse in un punto qualsiasi dell'editor, nel menu di scelta rapida, scegliere Struttura e quindi fare clic su Interrompi struttura.
Nell'editor di Visual Studio trovare il metodo IsValid . All'interno del metodo IsValid sostituire l'implementazione esistente con quella seguente:
return true;
Nell'editor di Visual Studio trovare il metodo Open . All'interno del metodo Open sostituire l'implementazione esistente con l'implementazione seguente. In questo modo viene illustrato come usare l'elemento URI enableAuthentication per assicurarsi che venga fornito il nome utente:
// only validate the credentials if EnableAuthentication // connection property value is true if (this.ConnectionFactory.ConnectionUri.EnableAuthentication) { // this adapter expects a value in username // it just logs the credentials in the trace file if (this.connectionFactory.ClientCredentials != null && string.IsNullOrEmpty(this.connectionFactory.ClientCredentials.UserName.UserName)) { throw new CredentialsException("Username is expected."); } // got the username, log it in trace file EchoAdapterUtilities.Trace.Trace(System.Diagnostics.TraceEventType.Information, "EchoAdapterConnection::Open", "Username is " + this.connectionFactory.ClientCredentials.UserName.UserName); } EchoAdapterUtilities.Trace.Trace(System.Diagnostics.TraceEventType.Information, "EchoAdapterConnection::Open", "Connection successfully established!");
Nell'editor di Visual Studio trovare il metodo Close . All'interno del metodo Close aggiungere l'istruzione singola seguente:
EchoAdapterUtilities.Trace.Trace(System.Diagnostics.TraceEventType.Information, "EchoAdapterConnection::Close", "Connection successfully closed!");
Aggiornamento di EchoAdapterConnectionFactory
Si implementa il costruttore EchoAdapterConnectionFactory e si aggiungono due proprietà denominate ClientCredentials e ConnectionUri.
Per aggiornare la classe EchoAdapterConnectionFactory
In Esplora soluzioni fare doppio clic sul file EchoAdapterConnectionFactory.cs.
Nell'editor di Visual Studio fare clic con il pulsante destro del mouse in un punto qualsiasi dell'editor, nel menu di scelta rapida, scegliere Struttura e quindi fare clic su Interrompi struttura.
Nell'editor di Visual Studio trovare l'area Campi privati . Aggiungere l'istruzione singola seguente:
private EchoAdapterConnectionUri connectionUri;
L'elenco di campi privati deve corrispondere al seguente:
// Stores the client credentials private ClientCredentials clientCredentials; // Stores the adapter class private EchoAdapter adapter; private EchoAdapterConnectionUri connectionUri;
Nell'editor di Visual Studio trovare il metodo EchoAdapterConnectionFactory . All'interno del metodo del costruttore EchoAdapterConnectionFactory , prima di "}", aggiungere l'istruzione singola seguente come ultima istruzione.
this.connectionUri = connectionUri as EchoAdapterConnectionUri;
L'implementazione del metodo EchoAdapterConnectionFactory deve corrispondere alla seguente:
/// <summary> /// Initializes a new instance of the EchoAdapterConnectionFactory class /// </summary> public EchoAdapterConnectionFactory(ConnectionUri connectionUri , ClientCredentials clientCredentials , EchoAdapter adapter) { this.clientCredentials = clientCredentials; this.adapter = adapter; //added this.connectionUri = connectionUri as EchoAdapterConnectionUri; }
Nell'editor di Visual Studio trovare l'area Proprietà pubbliche . Aggiungere il codice seguente:
/// <summary> /// Returns the client credentials /// </summary> public ClientCredentials ClientCredentials { get { return this.clientCredentials; } } /// <summary> /// Returns the Connection Uri for this adapter /// </summary> public EchoAdapterConnectionUri ConnectionUri { get { return this.connectionUri; } }
Aggiornamento di EchoAdapterConnectionUri
Si implementa il costruttore predefinito EchoAdapterConnectionUri, il costruttore di overload EchoAdapterConnectionUri(Uri) e la proprietà Uri di override pubblica.
Per aggiornare la classe EchoAdapterConnectionUri
In Esplora soluzioni fare doppio clic sul file EchoAdapterConnectionUri.cs.
Nell'editor di Visual Studio fare clic con il pulsante destro del mouse in un punto qualsiasi dell'editor, nel menu di scelta rapida, scegliere Struttura e quindi fare clic su Interrompi struttura.
Nell'editor di Visual Studio trovare l'area Costruttori . All'interno del costruttore predefinito EchoAdapterConnectionUri(), aggiungere l'istruzione seguente:
Uri = new Uri("echov2://lobhostname/lobapplication?enableauthentication=False");
Nell'editor di Visual Studio, all'interno del costruttore di overload EchoAdapterConnectionUri(Uri) e aggiungere l'istruzione seguente:
Uri = uri;
L'implementazione del metodo EchoAdapterConnectionUri(URI) deve corrispondere alla seguente:
public EchoAdapterConnectionUri(Uri uri) : base() { Uri = uri; }
Nell'editor di Visual Studio, all'interno del metodo URI di override pubblico , sostituire quello esistente con la logica seguente. Get compila l'URI con echoInUpperCase o senza di esso. Il set analizza l'URI per recuperare il nome host, il nome del database e i valori di query.
get { // Build the uri if (String.IsNullOrEmpty(this.hostname)) throw new InvalidUriException("Invalid target system host name."); if (String.IsNullOrEmpty(this.application)) throw new InvalidUriException("Invalid target system data source name."); if (EchoInUpperCase) { // build the uri with echoInUpperCase= query string return new Uri(EchoAdapter.SCHEME + "://" + Hostname + "/" + Application + "?" + "enableAuthentication=" + EnableAuthentication + "&" + "echoInUpperCase=" + echoInUpperCase); } else { // build the uri without echoInUpperCase= query string return new Uri(EchoAdapter.SCHEME + "://" + Hostname + "/" + Application + "?" + "enableAuthentication=" + EnableAuthentication); } } set { // Parse the uri String[] enableAuthValue = GetQueryStringValue(value, "enableAuthentication"); if (enableAuthValue.Length > 0) this.enableAuthentication = Boolean.Parse(enableAuthValue[0]); String[] echoInUpperValue = GetQueryStringValue(value, "echoInUpperCase"); if (echoInUpperValue.Length > 0) this.echoInUpperCase = Boolean.Parse(echoInUpperValue[0]); this.hostname = value.Host; String[] applicationValue = value.AbsolutePath.Split('/'); if (applicationValue.Length > 1) this.Application = applicationValue[1]; }
In Visual Studio scegliere Salva tutto dal menu File.
Nel menu Compila scegliere Compila soluzione. È consigliabile compilare correttamente il progetto. In caso contrario, assicurarsi di aver seguito ogni passaggio precedente.
Nota
Il lavoro è stato salvato. È possibile chiudere Visual Studio in questo momento o andare al passaggio successivo, passaggio 4: implementare il gestore di esplorazione dei metadati per Echo Adapter.
Cosa ho appena fatto?
È stata implementata la connessione per l'adapter Echo. Sono stati appresi i componenti di connessione di WCF LOB Adapter SDK, la struttura di base dell'URI di connessione, come analizzare gli elementi URI a livello di codice e come usare l'elemento URI per modificare la funzionalità dell'adattatore.
Passaggi successivi
Si implementano funzionalità di esplorazione, ricerca e risoluzione dei metadati e scambio di messaggi in uscita. Infine, si compila e si distribuisce l'adapter.
Vedere anche
Passaggio 4: Implementare il gestore per l'esplorazione di metadati per Echo Adapter
Esercitazione 1: Sviluppare Echo Adapter