12.31.2011

Windows AppFabric p1–> Instalándolo en Windows 7

He decidido iniciar con una serie de post acerca del Windows AppFabric para crear arquitecturas distribuidas basadas en un servidor de aplicaciones en tecnologías Microsoft. Este es el primer post de la serie y para empezar he decidido utilizar Windows 7 como sistema operativo base.

Instalar el AppFabric en Windows 7

Ya que muchos utilizamos Windows 7 como sistema operativo de trabajo, o incluso existen empresas donde utilizan un pequeño servidor interno para instalar sus aplicaciones con Windows 7 Enterprise o Profesional decidí escribir este post que aunque parece repetido no lo es, ya que el anterior era acerca de instalar el AppFabric en Windows server 2008 R2 – algo mucho más complicado.

El instalador del AppFabric

Aunque podemos descargar e instalar el AppFabric para windows 7 desde el “Web Platform Installer”, yo prefiero descargarlo directamente desde el sitio de Microsoft y ejecutarlo desde mi máquina.

Como podemos ver en el sitio web de Microsoft dependiendo del sistema operativo que tengamos  debemos descargar el ejecutable establecido. En mi caso, estoy utilizando Windows 7 en 64 bits.

image

En la página de descargas procedemos con el archivo señalado en la imagen anterior.

image

Seguidamente procedemos a ejecutar el instalador y luego de la pantalla de bienvenida veremos la siguiente pantalla donde se nos pregunta que componentes deseamos instalar. En mi caso instalaré todos los componentes – por supuesto habrán más post respecto a la función de cada uno de estos componentes.

image

Luego se hará la comprobación de requisitos del sistema, como pueden ver en la siguiente imagen me falta un requisito para poder instalar el AppFabric.

image

Como ven, me falta el administrador remoto para IIS, el cual se puede descargar desde el web platform installer o desde el sitio www.iis.net. Cuando lo instalamos nos aparece el wizard de instalación.

image

Luego de finalizar esta instalación procedemos a darle “actualizar” a wizard del appFabric y ya podemos ver que ya no tenemos advertencias a la hora de continuar con la instalación.

image

Con eso procedemos a la instalación del AppFabric.

image

Una vez finalizada la instalación vamos a ver la pantalla de instalación completa y además una recomendación para instalar las últimas actualizaciones de Windows.

image

En el próximo post vamos a configurar el AppFabric para poder hacer tracking y persistencia de nuestros servicios y workflows.

Etiquetas de Technorati:

12.17.2011

Error TF237162: There is insufficient system memory on the Team Foundation Server SQL Server to run this query

 

El Problema

Trabajando con TFS en un máquina virtual de pruebas, me encontré este error cuando quise generar un Team project en VS 2010 para tener mis proyectos en una colección específica. Sin embargo se me presentaba el error TFS237162 y no me permitía crear los proyectos. Considerando que cuando instalo SQL Server yo le asigno el mínimo de memoria posible me di cuenta que el error podría andar por ahí.

Solución:

Para solucionar el problema solamente tuve que ir a incrementar la memoria máxima del servidor SQL Server que se usa como capa física de datos – La tenía en 64MB y la subí a 128 MB.

image

Luego de esto reinicié el servicio de SQL Server Express en la consola de servicios – accesible desde Windows + R  en services.msc

image

y los proyectos TFS ya pudieron ser creados de manera correcta.

image

Etiquetas de Technorati:

12.11.2011

Error 503 Accediendo TFS

Realizando una instalación básica de TFS 2010 en Windows 7, me encontré con el error 503 "Servicio no disponible” cuando quise acceder al sitio del Team Foundation. Investigando un poco me di cuenta que hay 3 posibilidades principales para que este error este sucediendo cuando queremos acceder a la dirección del servidor.

Errores encontrados y soluciones

En primera instancia resultó que el usuario del TFS no era el mismo usuario que tenía el application pool sobre el cual corría el sitio del TFS por lo que procedí a configurar el mismo usuario para ambas acciones. En la siguiente figura se ve el usuario configurado en el administrador del TFS.

image

Ahora vemos el Application Pool en el IIS con el mismo usuario configurado.

image

El siguiente error esta relacionado con SQL Server. En mi caso el TFS no podía ver el servidor de base de datos pese a que estaba en la misma máquina. Para solucionar este problema simplemente vamos a la opción de configuración de SQL Server y habilitamos conectividad vía Pipes para la instancia de la base de datos que estamos utilizando.

image

El último error esta relacionado con el puerto de instalación del TFS. Normalmente este utiliza el puerto 8080 para trabajar en el IIS; sin embargo, si ya tenemos otros sitios web en este servidor IIS el puerto también será utilizado por los otros sitios web que ya fueron creados, con lo cual no puede levantar el servicio del TFS. Para cambiar esto, seleccionamos el sitio web del TFS –> “ Team Foundation Server” y en la opción de enlaces o “Bindings” cambiamos el puerto de 8080 a 8081 – pudiendo ser cualquier otro puerto.

image

Luego de estos tres cambios ya puedo ver el sitio del TFS.

image

Etiquetas de Technorati: ,

12.10.2011

Aprendiendo WF parte 8 – Invocando métodos de otras clases en WF

Quizás la funcionalidad más común a la hora de trabajar con WF en una arquitectura n-layer sea invocar los métodos de los componentes de lógica de negocios. En este post vamos a ver como invocar un método que reside en otro componente.

El método a invocar

En primera instancia vamos a crear un método que recibe una colección de números y me devuelve los números pares. Este método estará en una clase aparte que se llamará MathHelper. El código de esta clase se puede ver en la siguiente figura:

image

El workflow que invoca el método BuscarPares

Ahora vamos a crear un workflow que va a requerir invocar el método BuscarPares de la clase MathHelper recién mostrada. Este workflow simplemente recibe la lista de los números enteros, los procesa – a través de la clase MathHelper – y retorna la lista solamente conteniendo números pares.

En el workflow creado por la aplicación de consola – Workflow Application – procedemos a crear dos argumentos:

  • Lista de entrada: pListaEntrada
  • Lista de Salida: pListaNumerosPares

image

Seguidamente procedemos a agregar una secuencia y luego de esto a agregar la figura que nos va a permitir invocar el método BuscarPares.

image

Como vemos en la figura anterior, nos falta configurar la figura InvokeMethod la cual nos va a permitir invocar el método BuscarPares en la clase MathHelper.

En este caso, tenemos tres parámetros por completar de manera visual los cuales tienen el siguiente significado:

  • TargetType: Este es el tipo de la clase que se va a utilizar en el caso de que se requiera invocar un método estático.
  • TargetObject: Este es el tipo de la clase que se va a utilizar en el caso de que se requiera invocar un método de instancia.
  • MethodName: El nombre del método a invocar.

En nuestro caso, como vamos a trabajar con un método de instancia tenemos que completar los campos TargetObject y MethodName.

Para el caso del targetObject vamos a tener que declarar una variable del tipo MathHelper dentro del workflow e instanciarla.

La creación de la variable se hace seleccionando la secuencia lanzada al workflow y digitando la variable en la parte inferior del workflow. La variable es la siguiente:

image

Para inicializar esta variable – para crear la instancia – procedemos con una figura del tipo Assign tal y como se ve a continuación:

image

Ahora procedemos a  configurar la figura de invocar método con la variable recién creada e inicializada.

image

Todavía nos falta configurar los parámetros de entrada y el retorno del método que vamos a invocar, para esto vamos a las propiedades de la figura InvokeMethod y configuramos ambos ítems. Primero establecemos que el retorno de la función será asignado a la lista pListaNumerosPares.

image

El siguiente paso es configurar los parámetros que debe recibir el método, la lista de los números a procesar. Para esto procedemos a seleccionar la propiedad “Parameters” y le damos click en la “elipsis” –> “…”. En esta pantalla procedemos a configurar el parámetro de envío.

image

Como vemos en la siguiente figura del workflow completo, este ya no tiene errores.

image

Ahora solo nos queda probar el workflow, para esto vamos a escribir el siguiente código en el método Main.

image

El resultado al ejecutar el código anterior es el siguiente:

image

Etiquetas de Technorati:

11.24.2011

Linq: TakeWhile y OrderBy

Trabajando con Linq, me ha tocado manipular colecciones de objetos en donde se deben aplicar condiciones a grupos de objetos o procesar objetos mientras se cumpla alguna condición. Un método que sin duda me llamó la atención es el TakeWhile el cual permite procesar los elementos mientras se cumpla la condición dada, si esta condición no se cumple, se descartan todos los elementos a partir del primero que no la cumpla.

Por ejemplo, queremos procesar la lista de productos cuyo precio sea menor de 500, todo esto basado en la siguiente clase de producto.

image

La lista de productos a procesar es la siguiente:

image

Ahora para poder cumplir con la condición inicial –> procesar los productos que cuestan menos de 500 <—y considerando que el método takeWhile detiene su procesamiento cuando la condición no se cumple, debemos ordenar la lista de productos retornada por precio, luego de esto vamos a aplicar el TakeWhile. Luego procedemos a retornar la lista resultante.

image

Al ejecutar el código anterior obtenemos el siguiente resultado:

image

Etiquetas de Technorati: ,,

11.12.2011

Aprendiendo WF parte 7– Excepciones (1)

Continuando con nuestras serie de post acerca de WF, en esta ocasión nos vamos a enfocar en el manejo de excepciones dentro del workflow. Para esto, vamos a utilizar el workflow del post anterior para manejar las excepciones.

Provocando el error en el workflow

Nuestro ejemplo asume que la lista que viene como parámetro de entrada siempre viene inicializada, es decir ya esta instanciada, pero que pasaría si nos envía una lista nula? Para ver que pasaría vamos a cambiar el código en el programa de consola de la siguiente forma:

image Ahora si ejecutamos la aplicación, vamos a obtener el siguiente mensaje de error:

image

Como podemos ver en la figura anterior, la excepción se lanzo desde el workflow y nosotros no tenemos la más mínima idea de lo que puede estar ocurriendo. Aquí es donde entra el manejo de excepciones.

Agregando Excepciones al Workflow

Vamos a manejar la excepción anterior dentro del workflow utilizando las actividades que workflow foundation ya tiene construidas para tal propósito. Las mismas se pueden ver en la siguiente figura:

image

Primero vamos a agregar una figura TryCatch para meter nuestro código dentro de este. Luego dentro de la secuencia del try vamos a agregar nuestro código para manipular las colecciones.

image

Como vemos en la figura anterior tenemos un error en el workflow – signo de admiración – lo cual es provocado porque no hemos configurado el catch del bloque para el manejo de errores. Para reparar este problema vamos a agregar una excepción genérica del tipo System.Exception para procesar todos los errores que se den dentro del bloque en un solo lugar.

image

Luego hacemos click en la superficie del workflow y nos queda a disposición el bloque de catch para manejar la excepción. En la parte derecha del bloque esta el nombre de la instancia en donde vendrá encapsulada la excepción.

image

Para este ejemplo simplemente vamos a relanzar la excepción y vamos a poner un mensaje un poco más “legible” para que a la hora de manejarlo del lado del cliente se tenga una mejor noción del problema. Para esto vamos a agregar una figura de rethrow y la vamos a configurar con la instanciación de una nueva excepción y de un mensaje indicando el problema de forma general.

image

Para esto vamos a ir a las propiedades de la figura rethrow y le vamos a agregar el siguiente código.

image

Ahora nuestro workflow lucirá de la siguiente manera.

image

El siguiente paso es manejar la excepción del lado del programa para esto vamos a agregar el siguiente código del cliente de la consola.

image

Cuando ejecutamos el código anterior vamos a obtener el siguiente resultado.

image

Etiquetas de Technorati: ,

11.02.2011

Aprendiendo WF parte 6: Trabajando con colecciones en WF

Siguiendo con nuestros posts acerca de WF, vamos a trabajar con colecciones en los workflows de Workflow Foundation, algo que también será muy común en nuestras aplicaciones n-layer ya que normalmente trabajamos con colecciones de entidades.

Colecciones como Parámetros

Es muy común utilizar colecciones de objetos para llevar a cabo procesos de negocios en nuestra empresa a través de los productos que día a día desarrollamos. Por ejemplo, vamos a requerir una colección de clientes cuando deseamos hacer una consulta de clientes, o una colección de productos cuando queremos ver los productos de una categoría específica. Como era de suponerse, en el workflow foundation podemos recibir, procesar y retornar colecciones de objetos.

En este post vamos a crear una colección de productos los cuales tienen la siguiente estructura.

image

En el ejemplo que estamos por construir, vamos a recibir una colección de Productos, la vamos a procesar y luego vamos a retornar todos los productos que están exonerados. Para esto vamos a crear un nuevo Workflow que se llame WfProcesarProductosExonerados y en este workflow vamos a crear dos parámetros:

  1. ProductosRecibidos: Colección de productos a procesar –> List<Producto>: Ingreso.
  2. ProductosExonerados: Colección de productos que están exonerados –> List<Producto>: Retorno.

Para crear la primera lista, seleccionamos en el tipo del argumento la opción Browse For Types. Luego nos aparecerá un diálogo en donde vamos a seleccionar – buscando – el tipo List<T>.

image

En esta lista procedemos a seleccionar el tipo que queremos asignarle a T, para esto procedemos a seleccionar de la lista desplegable la opción “Browse For Types” de nuevo. En esta opción seleccionamos la clase Producto.

image

Para la lista de retorno, solamente tenemos que expandir la lista del tipo y ya nos aparecerá disponible List<Producto> como tipo para elegir.

image

Ahora procedemos a crear el workflow. En este caso vamos a recibir la lista de productos – pProductosRecibidos – y la vamos a recorrer. Por cada producto vamos a preguntar si el producto esta exonerado, si es así procedemos a agregarlo a la nueva lista de retorno. El workflow completo se puede ver a continuación.

image

Es importante notar que para poder agregar los productos a la nueva lista, esta debe de ser instanciada antes de poder ser utilizada, tal y como se ve en la siguiente figura.

image

Igualmente es importante destacar que la estructura de ForEach debe de ser tipificada para que compile. Esto se logra cambiándole la propiedad TypeArgument del ForEach.

image

También se debe de utilizar la figura para agregar elementos a una colección. Esta figura debe de ser configurada con el ítem que se desea agregar –> en nuestro caso el item del foreach – y la colección a la que deseo agregar el ítem. También debo de agregar el tipo con el que va a trabajar la figura.

image

Ahora procedemos a trabajar en la consola. En primera instancia tenemos que crear la colección de productos que le vamos a enviar al workflow para que los procese.

image

Luego procedemos a crear la instancia del workflow y a pasarle los parámetros –> en este caso nuestra colección _productos. En la misma llamada se retorna la colección de productos ya procesados.

image

Seguidamente procedemos a convertir el parámetro de retorno en una lista y la procesamos.

image

El resultado al ejecutar el código anterior es el siguiente.

image

Etiquetas de Technorati: ,