Compartir a través de


Paso 3: Implementar la conexión para el adaptador de Echo

Paso 3 de 9

Tiempo de finalización: 45 minutos

En este paso, implementará la funcionalidad de conexión del adaptador echo. Según el SDK del adaptador de LOB de WCF, debe implementar la siguiente clase abstracta e interfaces al conectarse al sistema de destino.

  • Microsoft.ServiceModel.Channels.Common.ConnectionUri

  • Microsoft.ServiceModel.Channels.Common.IConnection

  • Microsoft.ServiceModel.Channels.Common.IConnectionFactory

    En lugar de derivar de la clase e interfaces abstractas anteriores, el Asistente para desarrollo de adaptadores genera automáticamente las tres clases derivadas, EchoAdapterConnection, EchoAdapterConnectionUri y EchoAdapterConnectionFactory. Además de crear las clases, cada una tiene un método predeterminado que produce una excepción específica, System.NotImplementedException. Esta instrucción recuerda al desarrollador que implemente cada clase. Cuando se implementa la clase , se debe quitar esta instrucción de inicio de excepción.

    En la sección siguiente, actualizará esas tres clases para comprender mejor cómo controlar una conexión, cuál es la estructura de URI y cómo recuperar mediante programación varios elementos URI y, a continuación, usar esos elementos dentro del adaptador.

Requisitos previos

Antes de comenzar este paso, debe haber completado correctamente el paso 2: Clasificar las propiedades de adaptador y conexión. Y debe tener una comprensión clara de las Microsoft.ServiceModel.Channels.Common.IConnectionclases , Microsoft.ServiceModel.Channels.Common.IConnectionFactoryy Microsoft.ServiceModel.Channels.Common.ConnectionUri .

El Asistente para desarrollo de adaptadores genera tres clases derivadas, EchoAdapterConnection, EchoAdapterConnectionUri y EchoAdapterConnectionFactory. A continuación se proporciona una breve introducción a los métodos asociados a cada uno.

EchoAdapterConnection

En función de la complejidad del adaptador, es posible que tenga que implementar todos los cinco métodos siguientes. En el caso del adaptador echo, la mayoría no son compatibles, ya que la muestra del adaptador de eco no implica ningún sistema de destino.

Método Descripción
public void Close(TimeSpan timeout) Cierra la conexión al sistema de destino. El adaptador echo usa este método para agregar solo eventos de seguimiento al agente de escucha de seguimiento.
public bool IsValid(TimeSpan timeout) Devuelve un valor que indica si la conexión sigue siendo válida.

No es compatible con el adaptador echo.
public void Open(TimeSpan timeout) Abre la conexión al sistema de destino.

N/A para el adaptador de eco. Sin embargo, en el ejemplo se muestra cómo usar un elemento URI denominado enableAuthentication para exigir a los usuarios que proporcionen un nombre de usuario.
public void ClearContext() Borra el contexto de la conexión. Se llama a este método cuando la conexión se vuelve a establecer en el grupo de conexiones.

No es compatible con el adaptador echo.
public void Abort() Anula la conexión al sistema de destino.

No es compatible con el adaptador echo.

EchoAdapterConnectionFactory

El generador de conexiones es responsable de crear la conexión. De forma predeterminada, solo debe modificar esta clase al conectarse a un sistema de destino. Aunque el adaptador echo no implica ningún sistema de destino, muestra cómo usar un elemento URI personalizado denominado enableAuthentication si la conexión requiere autenticación de usuario.

Nota:

EnableAuthentication no es una palabra clave, sino solo un nombre de variable. Por lo tanto, puede elegir cualquier nombre para él.

EchoAdapterConnectionUri

Representa un cadena de conexión al sistema de destino.

Método Descripción
URI de invalidación pública Obtiene y establece el URI. Obtiene para compilar la cadena de URI y establece para analizar la cadena de URI.
public EchoAdapterConnectionUri() Inicializa una nueva instancia de la clase ConnectionUri.
cadena de invalidación pública SampleUriString Devuelve EchoAdapter.SCHEME + "://{hostname}/{application}?enableAuthentication={True|False}".

Esta cadena de retorno se muestra como ejemplo en la herramienta Add Adapter Service Reference Plug-in, como se muestra en la ilustración siguiente.

Captura de pantalla que muestra el cuadro de diálogo Agregar servicio de adaptador.

URI de conexión del adaptador de eco

El URI de conexión del adaptador de eco de ejemplo se describe como: EchoAapter.SCHEME://{nombre de host}/{application}?enableAuthentication={true|false}

Dado que EchoAapter.SCHEME es echov2, el URI de conexión es:

echo2://lobhostname/lobapplication?enableAuthentication={true|false}

Puede leer el URI de conexión anterior cuando enableAuthentication=false como se indica a continuación:

Con el esquema de transporte echov2, vaya a un equipo denominado lobhostname, donde una aplicación denominada lobapplication que no requiera autenticación esté esperando la conexión.

O bien, cuando enableAuthentication=true, lea la conexión de la siguiente manera:

Con el esquema de transporte echov2, vaya a un equipo denominado lobhostname, donde una aplicación denominada lobapplication espera que la autenticación esté esperando la conexión. Para el adaptador echo, solo se requiere un nombre de usuario.

Con un URI definido, puede consumirlo y analizarlo mediante programación para la conectividad y la configuración. Si la conexión requiere datos confidenciales, como un nombre de usuario y una contraseña, no contenga dicha información en el URI. En su lugar, agregue dicha información en el System.ServiceModel.Description.ClientCredentials objeto . En el ejemplo de código que agregue se muestra cómo hacerlo.

En el código siguiente, el adaptador echo construye el URI de dos maneras para mostrar cómo el adaptador puede usar varios elementos URI para modificar la característica del adaptador.

echo2://lobhostname/lobapplication?enableAuthentication=[true|false]

echo2://lobhostname/lobapplication?enableAuthentication=[true|false]&echoInUpperCase=true

Recuperación del elemento URI

Puede analizar cada elemento URI en el URI del adaptador de eco echo2://lobhostname/lobapplication?enableAuthentication=false&echoInUpperCase=false. Los valores del elemento URI y los métodos asociados se enumeran en la tabla siguiente:

Valor del elemento URI Método
lobhostname System.Uri.Host%2A para recuperar el nombre de host
Lobapplication System.Uri.AbsolutePath%2A para recuperar el nombre de la aplicación de destino
enableAuthentation=false GetQueryStringValue("enableAuthentication")

Use este elemento URI para validar las credenciales de usuario Nota: GetQueryStringValue es un método estático definido en . Microsoft.ServiceModel.Channels.Common.ConnectionUri
echoInUpperValue=false GetQueryStringValue("echoInUpperValue")

Use este elemento URI para convertir la cadena entrante en mayúsculas.

Elemento URI EnableAuthentication

El sistema de destino a menudo requiere que proporcione credenciales de cliente para establecer una conexión con el sistema de destino. Como se mencionó, el adaptador echo no implica ningún sistema de destino. Aunque como ejemplo, muestra cómo usar un elemento URI personalizado denominado enableAuthentication para proporcionar las credenciales.

 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.");  
        }  
  }  
}  

El código comprueba si enableAuthentication es true y si no se proporciona un nombre de usuario; Si no se proporciona un nombre de usuario, produce una excepción, que la herramienta Add Adapter Service Reference Plug-in detecta, como se muestra a continuación:

Captura de pantalla que muestra la excepción que se produce si no se proporciona el nombre de usuario.

Para proporcionar el nombre de usuario, puede escribirlo en el cuadro de diálogo Configurar adaptador de la herramienta Add Adapter Service Reference Plug-in (Agregar complemento de referencia de servicio de adaptador), como se muestra en la ilustración siguiente:

Captura de pantalla que muestra el cuadro de diálogo Configurar adaptador.

Elemento URI EchoInUpperCase

Se puede hacer referencia al elemento URI EchoInUpperCase como una marca booleana. Si la marca es true, el adaptador convierte la cadena de entrada de la operación EchoStrings en mayúsculas.

Para cambiar el valor predeterminado del elemento URI echoInUpperCase, use la pestaña Propiedades del URI del adaptador de configuración en el complemento Agregar referencia de servicio de adaptador, como se muestra a continuación.

Captura de pantalla que muestra el elemento URI EchoInUpperCase.

Actualización de EchoAdapterConnection

Implemente el método IsValid, Open y Close de la clase EchoAdapterConnection.

Para actualizar la clase EchoAdapterConnection

  1. En Explorador de soluciones, haga doble clic en el archivo EchoAdapterConnection.cs.

  2. En el editor de Visual Studio, haga clic con el botón derecho en cualquier parte del editor, en el menú contextual, seleccione Esquematización y, a continuación, haga clic en Detener esquematización.

  3. En el editor de Visual Studio, busque el método IsValid . Dentro del método IsValid , reemplace la implementación existente por la siguiente:

    return true;  
    
  4. En el editor de Visual Studio, busque el método Open . Dentro del método Open , reemplace la implementación existente por la siguiente implementación. Esto muestra cómo usar el elemento URI enableAuthentication para asegurarse de que se proporciona el nombre de usuario:

    // 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!");  
    
  5. En el editor de Visual Studio, busque el método Close . Dentro del método Close , agregue la siguiente instrucción única:

    EchoAdapterUtilities.Trace.Trace(System.Diagnostics.TraceEventType.Information, "EchoAdapterConnection::Close", "Connection successfully closed!");  
    

Actualización de EchoAdapterConnectionFactory

Implemente el constructor EchoAdapterConnectionFactory y agregue dos propiedades denominadas ClientCredentials y ConnectionUri.

Para actualizar la clase EchoAdapterConnectionFactory

  1. En Explorador de soluciones, haga doble clic en el archivo EchoAdapterConnectionFactory.cs.

  2. En el editor de Visual Studio, haga clic con el botón derecho en cualquier parte del editor, en el menú contextual, seleccione Esquematización y, a continuación, haga clic en Detener esquematización.

  3. En el editor de Visual Studio, busque la región Campos privados . Agregue la siguiente instrucción única:

    private EchoAdapterConnectionUri connectionUri;  
    

    La lista de campos privados debe coincidir con lo siguiente:

    // Stores the client credentials  
    private ClientCredentials clientCredentials;  
    // Stores the adapter class  
    private EchoAdapter adapter;  
    private EchoAdapterConnectionUri connectionUri;  
    
  4. En el editor de Visual Studio, busque el método EchoAdapterConnectionFactory . Dentro del método del constructor EchoAdapterConnectionFactory , antes de "}", agregue la siguiente instrucción única como la última instrucción.

    this.connectionUri = connectionUri as EchoAdapterConnectionUri;  
    

    La implementación del método EchoAdapterConnectionFactory debe coincidir con lo siguiente:

    /// <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;  
    }  
    
  5. En el editor de Visual Studio, busque la región Propiedades públicas . Agregue el siguiente código:

    /// <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;  
        }  
    }  
    

Actualización de EchoAdapterConnectionUri

Implemente el constructor predeterminado EchoAdapterConnectionUri, el constructor sobrecargado EchoAdapterConnectionUri(Uri URI) y la propiedad URI de invalidación pública.

Para actualizar la clase EchoAdapterConnectionUri

  1. En Explorador de soluciones, haga doble clic en el archivo EchoAdapterConnectionUri.cs.

  2. En el editor de Visual Studio, haga clic con el botón derecho en cualquier parte del editor, en el menú contextual, seleccione Esquematización y, a continuación, haga clic en Detener esquematización.

  3. En el editor de Visual Studio, busque la región Constructores . Dentro del constructor predeterminado EchoAdapterConnectionUri(), agregue la siguiente instrucción:

    Uri = new Uri("echov2://lobhostname/lobapplication?enableauthentication=False");  
    
  4. En el editor de Visual Studio, dentro del constructor sobrecargado EchoAdapterConnectionUri(URI) y agregue la siguiente instrucción:

    Uri = uri;  
    

    La implementación del método EchoAdapterConnectionUri(Uri URI) debe coincidir con lo siguiente:

    public EchoAdapterConnectionUri(Uri uri)  
        : base()  
    {  
        Uri = uri;  
    }  
    
  5. En el editor de Visual Studio, dentro del método URI de invalidación pública , reemplace el existente por la lógica siguiente. Get compila el URI con echoInUpperCase o sin él. El conjunto analiza el URI para recuperar el nombre de host, el nombre de la base de datos y los valores de consulta.

    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];  
    }  
    
  6. En Visual Studio, en el menú Archivo , haga clic en Guardar todo.

  7. En el menú Compilar , haga clic en Compilar solución. Debe compilar correctamente el proyecto. Si no es así, asegúrese de que ha seguido todos los pasos anteriores.

Nota:

Ya ha guardado su trabajo. Puede cerrar Visual Studio de forma segura en este momento o ir al paso siguiente, Paso 4: Implementar el controlador de exploración de metadatos para el adaptador de eco.

¿Qué hice?

Ha implementado la conexión para el adaptador echo. Ha aprendido los componentes de conexión del SDK del adaptador de LOB de WCF, la estructura básica del URI de conexión, cómo analizar mediante programación los elementos URI y cómo puede usar el elemento URI para cambiar la característica del adaptador.

Pasos siguientes

Implemente las funcionalidades de exploración, búsqueda y resolución de metadatos y el intercambio de mensajes salientes. Por último, compile e implemente el adaptador.

Consulte también

Paso 4: Implementar el controlador de exploración de metadatos para el adaptador de Echo
Tutorial 1: Desarrollar el adaptador de Echo