Pointer to (void)
Flash Remoting MX & .NET Primer
Octubre 22nd, 2004 - [Enlace local]
Nota a 23 de enero de 2005: Siento no haber publicado el post antes, cayó en el olvido por error y estaba marcado como draft desde hace bastante... No he adjuntado el código fuente, por tiempo nada más, pero si alguien lo quiere encarecidamente lo empaqueto y lo subo. Gracias ;-)
Bueno, por fin tengo hoy un rato para escribir después de toda la agotadora semana de (medio) descanso que he podido tomarme. Hoy, pequeños y pequeñas, tengo la ocasión de presentar el primer trozo de papel técnico de Pointer to Void: Como conectar Flash MX con un ensamblado desarrollado en C#. ¿Que qué significa exactamente todo esto? Pues bien, que podemos utilizar código para la plataforma .NET desde Flash.
En este ejemplo mostraremos como escribir una pequeña pequeñísima capa que provea datos a una aplicación escrita para .NET y utilizarla desde Flash. Crearemos un pequeño ensamblado en forma de DLL que obtendrá los datos de una base de datos SQL Server y devolverá un DataSet con los datos pedidos. Y utilizaremos esa DLL desde Flash MX con pocas líneas de código.
Lo primero que deberíais hacer, antes de tiraros a la piscina, es armaros de paciencia y una copia de Flash MX 2004 Prof, Flash Remoting MX, una instalación de IIS con ASP.NET y un compilador de C#. Tranquilos que existen versiones de evaluación para todo.
La instalación de Flash Remoting MX es lo que más se os complicará. Para el ejemplo de este articulo y para casi cualquier desarrollo que hagais, los pasos para tener el sistema listo son:
- Instalar el servidor Web, un entorno de desarrollo para C# y comprobar que funcionan las aplicaciones para .NET con la base de datos.
- Instalar Flash Remoting MX. Crear una nueva aplicación ASP.NET y copiar los archivos flashgateway.dll y frconfig.txt al directorio bin de la nueva aplicación. Podéis copiarlos del directorio de instalación de Flash Remoting. Crea también un archivo vacío llamado gateway.aspx en la raiz de la nueva aplicación. Este será el punto de entrada.
- Instalar los componentes Flash Remoting para Action Script 2.0.
- Bajar el ZIP de código fuente de esos componentes de la misma página y copiarlos al directorio First Run/Classes de la carpeta donde esté instalado Flash. (Capón a Macromedia por la cagada).
Una vez realizada toda esta instalación, crearemos una pequeña clase que provea datos. Extraeremos el nombre y los apellidos de los usuarios de una base de datos, tal como sigue a continuación:
using System;
using System.Data;
using System.Data.SqlClient;
namespace remoteDataProvider
{
public class DataProvider
{
public DataTable ObtenerUsuarios ()
{
SqlConnection sqlConnection = new SqlConnection (
"server=(local);database=fluxdb;
Trusted_Connection=true");
SqlDataAdapter sqlDataAdapter =
new SqlDataAdapter (
"SELECT nombre, apellidos FROM Usuario",
sqlConnection);
DataSet ds = new DataSet();
sqlDataAdapter.Fill (ds, "Usuario");
return ds.Tables["Usuario"];
}
}
}
Básicamente solo tenemos que tener en cuenta que para que Flash entienda el formato de los datos devueltos, estos deben devolverse como DataTable, lo que se convertirá en un RecordSet en Flash.
¿Y cómo accedemos a esta DLL en Flash?. Previamente compilada, procederemos a copiarla en el directorio bin de la aplicación creada anteriormente. Y ahora toca Action Script 2.0. Situaros en cualquier punto en el que queráis llamar a la función y el código necesario es el siguiente:
import mx.remoting.Service;
import mx.remoting.PendingCall;
import mx.rpc.RelayResponder;
import mx.rpc.FaultEvent;
import mx.rpc.ResultEvent;
import mx.remoting.RecordSet;
var servicioPrueba:Service = new Service (http://localhost/testRemotingApp/gateway.aspx, null, "remoteDataProvider.DataProvider", null, null);
var pc:PendingCall = servicioPrueba.ObtenerUsuarios();
pc.responder = new RelayResponder (this, "ObtenerUsuarios_Result", "ObtenerUsuarios_Fault");
Como veis, el código apunta a la dirección URL de nuestra aplicación que enlazará el proveedor de datos con la aplicación en Flash. Hay dos funciones de callback definidas en la última línea (ObtenerUsuarios_Result y ObtenerUsuarios_Fault) que serán llamadas cuando se obtenga el resultado de haber llamado a la función o si dicha llamada falla. La función de callback una vez llegan los datos recibe un re:ResultEvent como entrada. El siguiente ejemplo muestra como utilizar ese objeto para extraer, de la primera fila, el nombre del usuario:
re.result.getItemAt(0).nombre
Resta recomendar la utilización de NetConnection Debuger, buena aplicación escrita en flash para depurar las conexiones entre los dos. Se instala con Flash MX. Otro día hablaremos de ello.