vtortola

agosto 2007 - Posts

Primer Service Pack para Windows Vista

Parece ser que el primer Serivce Pack para Windows Vista ya esta en Beta y estará disponible en unas semanas en TechNet y para los subscriptores de MSDN, la versión final entre finales del 2007 y finales del 2008. Ocupará 1GB y requerirá 7GB libres para la instalación ... casi nada.

Más info, en Ars Technica.

¿Era necesario ya? La gente cree que sí, y de hecho, 1GB (que además será comprimido...) es mucho parche. Personalmente solo he probado la version Home, y no me ha disgustado pero tampoco pagaría por migrar mi Windows XP Professional. En cualquier caso las cifras hablan, y el balance de vulnerabilidades en el tiempo de vida de Vista es mucho menor que XP con sus mismos días de vida, lo cual ratifica las declaraciones de Microsoft sobre que es el Windows más seguro.

Primer Service Pack para Windows Vista | vtortola.NET

Guia de Testeo de Rendimiento para Aplicaciones Web

Leo através del blog de Rico Mariani que JD Meier ha anunciado la versión final de la guía Performance Testing Guidance for Web Applications, que se suma al proyecto Performance Testing Guidance.

Estas guías proponen metodologías y técnicas para hacer tests de rendimiento en aplicaciones Web y Windows por medio de las herramientas que provee Visua Studio 2005 y Visual Studio 2005 Team System.

He estado echando un vistazo y ambos tienen muy buena pinta, como muestra este How To: Identificar funciones causantes de un cuello de botella por alto consumo de tiempo de usuario de CPU en aplicaciones servidor en un entorno de producción.

Merece la pena leer este trabajo.

Guia de Testeo de Rendimiento para Aplicaciones Web | vtortola.NET

Desarrolla para todos los lenguajes. CLSCompliant

Como ya había dicho anteriormente, hay un sin fin de lenguajes con los que se pueden programar en .NET, pero no todos siguen las mismas reglas, por ejemplo, hay unos que son case-sensitive(ie:C#) y otros case-insensitive (VB) ... Imaginad que escribo una librería .dll en C# y mi cliente la usará en su proyecto ASP.NET en VB (mis dos enemigos juntos xD) ..., imaginad que en esa librería he incluido dos métodos públicos con mismo nombre y parámetros que se diferencian en que uno empieza por mayúsculas y otro en minúsculas ... ¿que pasaría al abrirlo con VB? Pues que no podría diferenciarlo.

Para esto existe el CLS (Common Language Specification), que "...es una especificación estandarizada que describe un entorno virtual para la ejecución de aplicaciones, cuya principal característica es la de permitir que aplicaciones escritas en distintos lenguajes de alto nivel puedan luego ejecutarse en múltiples plataformas tanto de hardware como de software sin necesidad de reescribir o recompilar su código fuente..." (Vía Wikipedia)

Para ayudar a cumplir con el CLS existe el atributo a nivel de ensamblado CLSCompliant, que hará que el compilador nos avise en tiempo de diseño con "Warnings" en aquellos puntos donde infringimos alguna regla del CLS. Este es uno de esos casos donde ... no cuesta tanto hacer las cosas bien :D

Las principales reglas del CLS son:

    • Los elementos públicos no pueden diferenciarse unos de otros por las mayúsculas/minúsculas.
    • No se pueden usar tipos sin signo (ie: UInt16, UInt43, ..etc...).
    • Las sobrecargas de métodos no pueden diferenciarse por parámetros pasados por 'ref' ó 'out'.
    • Los elementos públicos no pueden comenzar con un guión bajo (underscore).
    • Los operadores no pueden sobrecargarse.

Todas las reglas no afectan a elementos privados, relamente lo que importa es cuidar la forma de la funcionalidad que se va a mostrar, no lo que hay por dentro.

Es uan verdadera pena que como indica el MSDN en la nota del atributo CLSCompliant... el compilador de "Visual Basic" no indique estas advertencias... una verdadera pena.

El compilador actual de Microsoft Visual Basic no genera intencionalmente una advertencia de compatibilidad con CLS, sin embargo, una futura versión del compilador emitirá el aviso.

Una muestra que espero que sea clarificadora:

using System;
using System.Collections.Generic;
using System.Text;
 
[assembly: CLSCompliant(true)]
 
namespace CLSCompliant
{
    public class MiClase
    {
        // 1. Los nombres de elementos públicos no pueden
        // diferenciarse únicamente en las mayúsculas/minúsculas
        // pues algunos lenguajes son case-insensitive.
 
        public void Metodo1(){}
 
        public void metodo1(){}
        // Warning: 'CLSCompliant.MiClase.metodo1()' differing only 
        //          in case is not CLS-compliant
 
 
        public int Propiedad1 { get { return 0; } }
        public int propiedad1 { get { return 0; } }
            // Warning: 'CLSCompliant.MiClase.propiedad1.get' differing 
            //          only in case is not CLS-compliant    
 
 
        /*     ---------------------      */
 
        // 2. No se pueden usar tipos "sin signo" como elementos
        // públicos de una clase ó incluso una interfaz.
 
        public uint Metodo2(){return default(UInt32);}
        // Warning: Return type of 'CLSCompliant.MiClase.Metodo2()' 
        //          is not CLS-compliant
 
 
        public void Metodo2(uint parametro){}
        // Warning: Argument type 'uint' is not CLS-compliant    
 
 
        /*     ---------------------      */
 
        // 3. Las sobre cargas de los métodos, no pueden diferenciarse
        // por parámetros 'ref' ó 'out'.
 
        public void Metodo3(int parametro){}
 
        public void Metodo3(ref int parametro){}
        // Warning: Overloaded method 'CLSCompliant.MiClase.Metodo3(ref int)' 
        //          differing only in ref or out, or in array rank, 
        //          is not CLS-compliant    
 
 
        /*     ---------------------      */
 
        // 4. Los elementos públicos no pueden comenzar con un
        // guión bajo (underscore).
 
        public void _Metodo5(){}
        // Warining: Identifier 'CLSCompliant.MiClase._Metodo5()' 
        //           is not CLS-compliant
 
 
        /*     ---------------------      */
 
        // 5. Los operadores no se pueden sobrecargar
 
        public static MiClase operator +(MiClase operando) { return null; }
 
        public static MiClase operator +(MiClase operando1, MiClase operando2) 
        { return null; }
            // Warning: Aquí debería dar un aviso ... que no dá, ¿será un bug?
    }
}

Prometo investigar que pasa con la sobrecarga de operadores que parece no avisar del error :S

Desarrolla para todos los lenguajes. CLSCompliant| vtortola.NET

Efecto Matrix en C#
matrixsharp Un código en C# para generar el efecto Matrix en consola, lo que se aburre la gente en vacaciones, en fin, Ya puedes quedar como un auténtico lammer hacker con tus colegas y hacer temblar a tu jefe xD

En cualquier caso, no deja de ser un experimento curioso e intersante en un sentido intrínsecamente técnico, así que no dejeis de echar un vistazo al código de esta "utilidad" :D 

Hay hasta un video en YouTube.

¿Que será lo próximo?

Efecto Matrix en C# | vtortola.Net

Modelo de ejecucion del .NET Framework. El CLR

Siguiendo con el artículo anterior donde explicaba que es el código administrado MSIL, voy a explicar ahora también de forma breve como el CLR (Common Language Runtime) ejecuta dicho código con la ayuda del JIT (Just In Time compiler), y cuales son las ventajas y características de este modelo de ejecución. Este es más extenso que el anterior, aunque está todo bastante resumido y explicado por encima espero que resulte interesante. 

Como comentaba, una vez generado el código administrado se compone un ensamblado junto los metadatos, el manifiesto que lo describe y los recursos que se hayan decidido incluir en él, estos datos permiten al CLR obtener información del ensamblado, sus tipos y recuperar el código administrado cuando se requiera.

El CLR es una máquina virtual, un entorno de ejecución para nuestro código MSIL, que provee las siguientes características:

  • Provee de un modelo consistente y homogéneo:
    • Basado plenamente en POO.
    • Todo son ensamblados, aunque se pueden usar elementos convencionales como .dll nativas, objetos COM+ y similares, siempre se realiza de una forma convenida.
    • Los errores siempre se disparan en forma de Excepción.
    • Es un modelo fuertemente tipado y el CLR verifica el código antes de su ejecución.
  • Permite trabajar con elementos no admnistrados como librerias en código nativo ó objetos COM+ mediante interoperabilidad.
  • Ejecuta todas las aplicaciones administradas dentro de un mismo espacio de direccionamiento virtual del sistema operativo de forma que se gana rendimiento al no tener que estar solicitando recursos al sistema operativo constantemente, pero cada aplicación se ejecuta en un dominio de aplicación del framework, que es un contenedor que impide que unas aplicaciones accedan a la memoria de otras, teniendo de esta forma la misma robustez y seguridad que si se ejecutasen en sus propios espacios de direccionamiento virtual.
  • Elimina el problema del "dll Hell", ya que los ensamblados van firmados con su número de versión en el manifiesto, lo que permite que numerosas dll con el mismo nombre y hasta la misma funcionalidad coexistan con diferentes números de versión.
  • Permite soporte multiplataforma, ya que el código administrado es independiente de la plataforma, un CLR para Linux podría ejecutar perfectamente dicho código.
  • Provee de un sistema de gestión de memoria encargado de recolectar la memoria en desuso u ocupada por objetos desreferenciados, el recolector de basura (Garbage Collector).
  • Soporte multithreading, que le permite ejecutar aplicaciones que trabajan con varios hilos de ejecución en paralelo.
  • Diversas técnicas para mejorar el rendimiento como la cache de objetos que permite la conservación y posterior reutilización de objetos que son costosos de crear, evadiendo la recolección de basura mientras permanecen en la cache. Un ejemplo de esto es el ThreadPool
  • Seguridad CAS (Code Access Security), un sistema de permisos independiente al del sistema operativo y la plataforma con el que el CLR puede evaluar si el código requerido tiene permisos para ejecutarse.
  • Seguridad basada en roles (Roled Based Security), un sistema de seguridad basado en perfiles de usuario también independiente del sistema operativo aunque se puede integrar con él.

Cuando ejecutamos un ensamblado ejecutable (una aplicación, no una libreria),  el CLR procede de la siguiente forma:

  1. Busca la entrada, normalmente la clase Program.
  2. Inicializa la clase inicializando todos sus campos.
  3. Busca el punto de entrada, normalmente el método Main.
  4. Detecta todos los tipos que son referenciados desde él y reserva la memoria oportuna.
  5. Empieza la ejecución, encuentra el primer método y lo busca en el ensamblado utilizando los metadatos.
  6. Procede con este método como en el punto 4.
  7. Carga el código administrado MSIL.
  8. Verifica el código MSIL asegurando que es seguro. Verifica cosas como :
    • Que cada método es invocado con el número y tipo correcto de parámetros.
    • Que los valores de retorno se reciben apropiadamente.
    • Que cada método tiene una instrucción de retorno.
  9. Llama a una función interna denominada JITCompiler (Just In Time Compiler), conocido también como JIT ó JITer. Esta función es la encargada de compilar el código administrado a código nativo, y se guarda en memoria dinámica.
  10. Se ejecuta el código nativo. Si se vuelve a ejecutar el mismo método, directamente el JITCompiler devuelve la dirección de memoria donde se compiló anteriormente, de forma que no se necesita verificarlo ni compilarlo dos veces.
  11. Continua la ejecución con el siguiente método de la misma forma.

El proceso de compilación dinámica produce una perdida de rendimiento y un mayor uso de memoria dinámica, pero es mínimo, además este proceso aporta una serie de ventajas bastante interesantes, echemos un vistazo más profundo al funcionamiento del JIT:

  • Compila el código administrado a código nativo y lo almacena en memoria dinámica, si se requiere usar de nuevo, se obtiene directamente el código nativo sin tener que volver a compilarlo. Cuando la aplicación termina dicho código se desecha.
  • Ya que se almacena en memoria dinámica, si se ejecuta el ensamblado en otro proceso Windows distinto, no se puede aprovechar la compilación anterior y se vuelve a compilar de nuevo.
  • Optimiza el código nativo al igual que un compilador C++, con la penalización de rendimiento que esto conlleva, pero la ejecución se realizará con un rendimiento mucho mayor que compensa de sobra la penalización anterior.
  • Puede determinar que CPU explícita (Pentium IV, Pentium III,...etc..) tiene como objetivo en tiempo de ejecución y generar código nativo optimizado para dicho objetivo, mientras que las compilaciónes de lenguajes convencionales suelen compilar para familias genéricas. De esta forma, el código nativo generado está siempre optimizado al máximo.
  • Puede optimizar el uso de variables que se encuentran en bucles mediante el uso de caches. Aunque en entornos multithreading esto puede representar un serio problema.
  • Puede determinar cuando la evaluación de determinadas condiciones son siempre True ó False en la máquina donde se ejecutan (como por ejemplo, evaluar cuantos procesadores hay), obviando la generación de código nativo para estas instruciones y asignando un valor directo, con lo que se gana velocidad de ejecución.
  • El CLR puede monitorizar y perfilar la ejecución del código MSIL, reorganizar y recompilar para mejorar el rendimiento en base a unos patrones de observación.

Gracias a todas estas características el decir que una aplicación en código administrado es más lenta que la misma en código nativo puede ser una afirmación precipitada, de hecho, puede ser hasta más rápida. De la misma forma, usar nGen no garantiza una ejecución más rápida, aunque si suele mejorar el tiempo de puesta en marcha. Otro día hablaré de nGen :D

Modelo de ejecución del .NET Framework. El CLR | vtortola.NET

Modelo de ejecucion del .NET Framework. Parte 1.

Voy a intentar explicar de forma breve en varios artículos como funciona el .NET Framework y que papel juegan sus diferentes partes. En esta primera parte a modo de introducción explicaré la diferencia entre el código fuente y el código administrado generado por el compilador, dejando el CLR y el JIT para una segunda parte.

  • El código fuente.

Nuestro código C# (ó cualquier otro lenguaje con el que desarrollemos en .NET... por exótico que sea), es un leguaje de alto nivel con el componemos la lógica que queremos programar.

Aquí se puede ver una extensa lista de los lenguajes con los que se puede programar en .NET.

  • El compilador.

En lenguajes convencionales no administrados, el compilador es el encargado de generar código binario final a partir del código fuente, dicho código binario también se denomina código nativo, y es el que el procesador de nuestro ordenador puede interpretar.

Este código se genera para una determinada arquitectura, como pueden ser x86, x64 ó IA64 y en determinados casos para un determinado tipo de procesador. El hecho de compilarlo para una determinada arquitectura ó procesador como objetivo, permite optimizar el código al máximo aprovechando las optimizaciones y/ó juegos de instruciones específicos de ese objetivo. El problema, es que solo existe compatibilidad hacia atrás y no en todos los casos, por lo que lo que se compile para x64 no funcionará en x86 y si por ejemplo compilasemos explícitamente para Intel PIV, ejecutarlo en un Intel PIII podría causar problemas inésperados y difíciles de seguir al intentar por ejemplo, ejecutar instrucciones que no existen en el juego de instrucciones de Intel PIII.

474px-Ensamble_NET

En los lenguajes administrados, el compilador de nuestro IDE genera un código intermedio, a mitad de camino entre el lenguaje ensamblador y el lenguaje de alto nivel (más próximo al segundo que al primero) que se usará a posteriori para generar el código nativo que entiende nuestro procesador. En .NET este código es denominado código administrado, CIL (Common Intermediate Language) ó MSIL (Microsoft Intermediate Language).  El compilador genera lo que se demomina ensamblado ó ensamble, donde además de nuestro código administrado se añade un manifiesto que es una descripción el esamblado, los recursos que hemos decidido incluir dentro del ensamblado y los metadatos, que son datos que describen los tipos, métodos y campos que lo componen.

Podemos ver el código administrado de un ensamblado mediante la herramienta Ildasm.exe.

 

Entre las principales ventajas de este método destacan ser independiente del lenguaje elegido y de la plataforma, de forma que cualquier lenguaje de .NET genera el mismo código administrado y este es independiente de la arquitectura donde se ejecute, a no ser que se indique explícitamente. En ocasiones, el ensamblado puede requerir de código nativo que sea dependiente de la plataforma, en las que podemos indicar que generamos en ensamblado para una determinada arquitectura, de forma que el .NET Framework nos avise de ello si intentamos ejecutarlo en otra distinta, pero esto no genera ninguna optimización especial del código administrado, simplemente es una restricción.

Este código es convertido a código nativo en tiempo de ejecución por medio del JIT, del que hablaré próximamente.

Modelo de ejecución del .NET Framework. Parte 1 | vtortola.NET

Inaugurando nuevo blog

Bueno, por fin después de varios días trabajando con la versión en desarrollo de BlogEngine.NET para realizar unos cambios y siguiendo los bugs que han ido solventando, tengo las características que necesito como para plantarme e inaugurar el blog !! :D Si alguien ve algún error que me mande un email.

Ahora, http://www.vtortola.net redirecciona allí siempre.

A partir de ahora bloggearé aquí, e iré recuperando algunos de los artículos que postee en mi antiguo blog en WordPressy mi blog en ElBruno, aunque en este seguiré hanciéndolo.

Ahora gracias al buen soporte para Live Writer, puedo poner código de forma más sencilla que con WordPress y con mejor resultado:

private bool canThreadIt()
{
    bool result = false;
    if (Thread.VolatileRead(ref runThreads) < maxThreads)
    {
        Interlocked.Increment(ref runThreads);
        result = true;
    }
    return result;
}

Pues lo dicho, aquí me encontrareis :D 

vtortola.NET

Aprobé el 70-529 !!! Ya soy (también) MCTS:Distributed Applications.
Aprobé el examen ! 921 points  y con esto ya tengo los tres MCTS :D
Mañana me voy de vacaciones (por fin!) y a la vuelta a por los MCPD de Windows y Enterprise Apps.

Según este documento donde se contabilizan las certificaciones a lo largo del mundo esta certificación es la que menos gente tiene (2500) ... pero lo verdaderamente desesperante es que solo hay 560 MCPD:Windows en el mundo !! , la mitad que de Web (1144) ... y más sorprendente aún ... menos de la tercera parte que de Enterprise Applications (1813).

A disfrutar del verano ... (ó lo que queda de él xD)
70-529 Resumen 13/13 : Gestión de servicios de componentes. MSMQ.
Décimo tercer repaso de 13 del temario para el examen 70-529 requerido para obtener el MCTS: Distributed Applications, del libro oficial de Microsoft.

Nostálgico, el segundo proyecto que desarrollé en .NET fué una plataforma para mensajes SMS basada en MSMQ 3.0 y la verdad es que la experiencia fué bastante grata.
  • MSMQ:
    • Permite que aplicaciones que funcionan en diferentes franjas horarias comunicarse a través de redes hetereogéneas y sistemas que podría estar termporalmetne inaccesibles.
    • Garantiza la entrega del mensaje.
    • Puede usarse para soluciones donde se requiere mensajeria síncrona o asíncrona.
    • Se utiliza a través de las clases de System.Messaging, las dos principales clases son MessageQueue y Message.
  • Las colas pueden ser públicas ó privadas. Las públicas requieren de Active Directory y son navegables, las privadas pueden ser accesibles en red en modo "Grupo de trabajo" si se usa MSMQ 3.0 y Windows2003 ó WindowsXP.
  • Hay dos tipos de colas de mensajes:
    • Express: Los mensajes se almacenan en RAM, es más rápida pero se pierden los mensajes si la máquina donde están falla ó si se para la cola. Un exceso de mensajes en RAM puede provocar una sobrecarga de paginación y degradar el rendimiento.
    • Recoverable: Los mensajes se almacenan en el disco duro durante en encaminamiento y la entrega, son más lentas que las Express pero más confiables, ya que si falla la máquina siguen estando en el disco duro. Se puede mejorar el rendimiento utilizando varios discos físicos para almacenar los mensajes.
  • Los mensajes pueden tener un tiempo de vida definido por TimeToReachQueue y TimeToBeReceived, una vez expirado ese tiempo pueden ser descartados ó enviados a una cola de 'no-enviados' según indique UseDeadLetterQueue.
  • Una cola de mensajes puede participar en una transacción distribuida DTC, aunque también tiene su propio concepto de transacción, MessageQueueTransaction. La enumeración MessageQueueTransactionType indica que tipo de transacción se va a realizar.
  • Se pueden enviar objetos como mensajes por medio de serialización.
  • La consola de administración del ordenador puede usarse para monitorizar la actividad y el estado de las colas.
  • Se pueden administrar los permisos por medio de la clase MessageQueue ó de la consola de administración del ordenador.
  • Cuando se echa un vistazo ('peeking') se obtiene una copia del mensaje, cuando se recibe ('receiving') se obtiene el mensaje, desapareciendo de la cola.
  • Enumerar los mensajes usando GetAllMessages permite echar un vistazo a todos los mensajes de la cola e iterar sobre ellos.
  • Mediante acuses de recibo podemos saber que un mensaje ha sido recibido y procesado por su destino. El proceso de saber a que mensaje corresponde cada acuse de recibo se denomina correlacionar. Mediante la propiedad Acknowledgment que acuses de recibo se quieren, con la propiedad AcknowledgmentQueue se usa para indicar al destinatario que quiero que me deposite los acuses de recibo en una cola especial, con la propiedad CorrelationId se indica que se debe recuperar la información de identificación.
  •  La autenticación del emisor puede ser reforzada por MSMQ comprobandola contra Active Directory ó contra un certificado proporcionado por una CA (Certification Authority).
  • Un mensaje se firma al activar la autenticación. Añade una firma digital al mensaje, el cual es invalidado si el mensaje es corrompido antes de ser recibido por el destinatario.
  • Validar un certificado requiere añadir lógica en el código para ello por el destinatario del mensaje.
  •  El cifrado de mensajes de MSMQ solo funciona si se esta en un dominio. El cifrado es realizado por el emisor, el descifrado se realiza por MSMQ siendo así transparente para el receptor.
  • En modo "Grupo de trabajo", se requiere usar un cifrado personalizado mediante las técnicas de .NET Framework.
  • El receptor, puede verificar el emisor inspeccionando la propiedad SenderCertificate.
70-529 Resumen 12/13 : Creando "Serviced components"
Décimo segundo repaso de 13 del temario para el examen 70-529 requerido para obtener el MCTS: Distributed Applications, del libro oficial de Microsoft.

Sin duda, el tema más interesante hasta el momento, aunque sospecho que el 13 también lo va a ser. Ya era hora porque me estaba empezando a aburrir xD
  • Los componentes con servicio son parte de "Enterprise Service", la nueva generación de COM+.
  • Escribir componentes con servicio.
  • Proveen de las siguentes funcionalidades:
    • Transacciones:  Se pueden realizar transaciones distribuidas. Gracias a CRM (Compesating Resource Manager) se pueden realizar transaciones sobre elementos no transacionales, como por ejemplo, el sistema de archivos.
    • Object pooling: Los objetos que son costosos de crear, se pueden almacenar en una cache, de forma que si se requiere una nueva instancia, primero se puede intentar obtener una ya creada pero en deshuso de la cache.
    • Activación JIT: Componentes que solo se crean cuando se van a utilizar y se destruyen justo después.
    • LCE (Loosely Coupled Events): Eventos remotos a través de la red, con remoting por supuesto.
    • Construcción de objetos: Una forma de construir objetos mediante un string con la información necesaria.
    • Componentes privados: Desde COM+ 1.5, se pueden definir componentes privados que solo son acesibles desde otros componentes.
    • Componentes encolados: MSMQ (MicroSoft Message Queue), un sistema para gestionar mensajes asíncronamente.
    • Seguridad Roled-based (basada en perfiles): Un sistema de perfiles de Enterprise Services independiente del sistema operativo, con todas sus ventajas pero con el añadido de no depender del sistema operativo.
    • Servicio SOAP: Los componentes de servicio pueden ser accesibles a través de webservies.
    • Sincronización: Provee acceso exclusivo de un thread a los componentes.
  • Para crearlo son necesarios 5 pasos:
    1. Heredar de la clase System.EnterpriseServices.ServicedComponent.
    2. Añadir un constructor por defecto (sin parámetros).
    3. Ornamentar la clase con el atributo [ComVisible].
    4. Elegir un método de activación COM+, como Library (solo puede ser accedido por clientes en la misma máquina) ó Server.
    5. Asignarle un nombre seguro (strong name).
  • La interacción con código administrado en "Enterprise Services" se realiza mediante varios atributos, la clase ContextUtil y la clase SecurityCallContext.
  • Hay cuatro formas de registrar un serviced component en el catálogo COM+:
    • MMC (Microsoft Management Console).
    • Service Installation Tool (Regsvcs.exe).
    • Registro dinámico: Referenciandolo directamente en el proyecto sin estar en el GAC.
    • Windows Installer (MSI).
  • Las transacciones en Enterprise Services usan System.Transactions si es posible, pero es retro-compatible con plataformas antiguas.
  • El atributo Transaction se usa para declarar una clase como parte de una transación.
  • El atributo AutoComplete se usa para dejar que un método notifique automáticamente el éxtio ó error de una transacción,  llamando a SetComplete si es OK ó disparando una excepción y anulando la transación si falla.
  • .NET 2.0 tiene LTM (Lightweight Transaction Manager), un componente que usa DTC solo si es necesario.
  • Servicios sin componente permiten usar una parte de Enterprise Services con la ventaja de no tener que preregistrar el componenten el el catálogo COM+
  • Para hacer uso de un componente de servicio, se igual que usar un ensamblado administrado corriente. Igual sucede con sus miembros.
70-529 Resumen 11/13 : Mensajeria y enrutamiento.
Décimo primer repaso de 13 del temario para el examen 70-529 requerido para obtener el MCTS: Distributed Applications, del libro oficial de Microsoft.
  • WSE Messaging puede usarse para extender la funcionalidad de los webservices tradicionales.
  • WSE 3.0 permite espeficiar el protocolo de comunicación, tanto TCP como HTTP.
  • WSE Messaging puede usarse para implementar mensajería de "solo ída", en la cual la comunicación ocurre en ambos sentidos y usa las clases SoapSender y SoapReceiver.
  • La mensajería de "dos sentidos" es en la que la comunicación es permitida en un sentido, usa las clases SoapClient y SoapService. Son similares a las anteriores.
  • Se pueden mandar "adjuntos" junto a los mensajes SOAP a través del uso de MTOM, el cual es el principal vehículo para enviar datos binarios.
  • Un router WSE es un intermediario entre los webservices y el mundo exterior. Es simplemente un webservice que recibe la petición y la encamina al destino apropiado.
  • Se usa una clase SoapHttpRouter y se debe sobreescribir el método ProcessRequestMessage. Este método lee el paquete SOAP entrante, determina a donde debería ser encaminado y devuelve la URI.
  • El router se configura mediante un archivo llamado ReferralCache.config que incluye las URLs del router y de los webservices destino.
  • Se pueden añadir elementos a <HttpHandlers> en el Web.config, de forma que el router sepa que peticiones tiene que tratar.
  • Las credenciales de seguridad son tratadas de forma distinta cuando pasan por un router WSE. Primero se han de validar entre el cliente y el router y opcionalmente entre el router y el webservice.
  • Si aumentas la seguridad usando certificados X.509, necesitas crear una directiva personalizada.
  • Para los mensajes que se pasan entre el cliente y el router, y entre este y el webservice deben tener el atributo serviceActor configurado con algo que no sea un string vacio.
  • Además de la seguridad de un certificado X.509, puedes usar UsernameToken, UsernameOverTransport ó AnonymousOverX509.
  • Verificar las credenciales de seguridad de un certificado X.509 se hace incluyendo un elemento <x509> en el Web.config del router.
Posted: ago 15 2007, 05:08 by vtortola | with no comments
Filed under: ,
70-529 Resumen 10/13 : WSE Security
Décimo repaso de 13 del temario para el examen 70-529 requerido para obtener el MCTS: Distributed Applications, del libro oficial de Microsoft.
  • WSE Security.
  • Con la herramienta WseConfigEditor3 podemos gestionar la mayoria de elementos de la configuración de WSE, como ajustes generales, de seguridad, de directivas, routing, cuestiones sobre tokens, diagnósticos y mensajeria.  En versiones anteriores de WSE, WseConfigEditor estaba solo disponible a través de proyectos individuales. Desde WSE 3.0, la herramienta puede usarse con Visual Studio 2005 ó una aplicación independiente.
  • Si se implementa una directiva personalizada en una aplicación, la pestaña Policy de WseConfigEditor3 se puede usar para gestionarla. Esta característica provee acceso a asistente "Security Settings Wizard" que permite configurar complicadas directivas.
  • Hay cuatro modo de autenticación disponibles para una directiva personalizada:
    • Anónima: La más imple y para muchos la más insegura. No utiliza credenciales. El servidor se asegura de que el cliente envie los datos cifrados con la clave pública del servidor, y este le envia las respuestas cifradas con una clave simétrica que fué suministrada por el cliente. Debería usarse solo en seguridad a nivel de transporte.
    • Windows: Igual que la anónima solo que el cliente provee un ticket Kerberos que el servidor autentica. Al usar Kerberos se obtiene una gran seguridad con bajo coste de administración.
    • Certificado: Igual que la anónima solo que el cliente provee un certificado como su credencial en la petición el cual es autenticado por el servidor.
    • UserName: Igual que la anónima solo que el ciente provee un usuario y contraseña como sus credenciales en la petición, las cuales autentica el servidor.
  • Mediante un archivo XML de configuración de directivas podemos añadir las que necesitemos.
  • La identidad de un receptor ó remitente como también que los datos no han sido alterados durante la comunicación se verifica mediante las firmas digitales.
  • El proceso de ofuscar un mensaje de forma que partes no autorizadas no puedan verlo se conoce como cifrado. Las firmas digitales y los mensajes cifrados pueden ser usados separadamente, pero si se usan juntos proveen un potente marco para asegurar los datos. El proceso de coger un mensaje cifrado y hacerlo compresible se conoce como descifrar.
  • Por defecto, el cifrado de WSE 3.0 solo puede hacerlo sobre el body del mensaje. Si hay datos sensibles fuera del body serán accesibles para partes no autorizadas a no ser que se cifren también.
  • El método SecurityContextTokenService.IssueSecurityContextTokenRequest se usa para indicar los elementos <RequestSecurityToken> y el <RequestSecurityTokenResponse> de una petición.
  • La declaración de una directiva personalizada sería creaada cuando uno de las que ya hay no reunen las necesidades de tu aplicación. Debe derivar de las clases PolicyAssertion ó SecurityPolicyAssertion.
  • Los filtros de mensajes representan la mayor funcionaliad respecto a seguridad de WSE pero implica grandes cambios de la versión 2.0 a la 3.0.
  • Las clases que se usen para filtrar mensajes deben heredar de las clases SoapFilter, ReceiveFilter ó SendSecurityFilter.
  • La clase SoapFilter debería usarse para procesar tareas donde no se traten mensajes SOAP seguros.
  • Las clases derivadas de SoapFilter deben implementar el método ProcessMessage y devolver un SoapFilterResult.Continue para asegurar que el código cliente que lo invocó puede seguir haciendolo.
  • Las clases derivadas de SendSecurityFilter deberian implementar el método SecureMessage.
  • Las clases derivadas de ReceiveSecurityFilter deberian implementar el método ValidateMessageSecurity.
  • Ya que los filtros no siempre se añaden, para trabajar con WSE 3.0 debe crearse una directiva personalizada para manejar su implementación. 
70-529 Resumen 9/13: Web Services Enhancements 3.0 en aplicaciones cliente y servidor.
Noveno repaso de 13 del temario para el examen 70-529 requerido para obtener el MCTS: Distributed Applications, del libro oficial de Microsoft.
  • Web Services Enhancements (WSE) aumenta las funcionalidades por defecto de los servicios web.
  • Enlace de descarga.
  • Añadir una refencia a la libreria de WSE 3.0 se hace igual que con cualquier otra, el espacio de nombres es Microsoft.Web.Services3.
  • Soporta: XML, SOAP, WSDL, WS-Security, WS-Trust, WS-SecureConversation, WS-Addressing and MTOM (sustituto de DIME).
  • Las cabeceras SOAP definidas en WS-Security son accesibles a través del objeto SoapContext.
  • La clase proxy para WSE necesita heredar de WebServicesClientProtocol.
  • Cuando añadimos una referencia web que apunta a un WSE, Visual Studio construye la clase proxy de forma adecuada sin que tengamos que reescribirla.
  • Si un objeto de tipo WebServicesClientProtocol es interpretado (casting) como un SoapHttpClientProtocol, los miembros que no existan en el primero se perderán.
  • SoapExtensions pueden ser añadidas, eliminadas y limpiadas a través del archivo de configuración.
  • Además pueden ser también manipuladas de forma declarativa (atributos) e imperativa(código, por ejemplo, sobre escribiendo los métodos de serialización).
  • Secciones personalizadas de configuración, como las de Microsoft.Web.Services3, pueden ser añadidas a través de la sección <configSections> del archivo de configuración.
  • Se pueden añadir firmas digitales a los mensajes para verificar su integridad.
  • Se pueden usar cuatro mecanismos (tokens) distintos para firmar los mensajes:
    • Certificados X.509 : A través de un certificado de este tipo instalado en la máquina, se obtienen la clave pública y privada, la pública se usa para firmar los mensajes SOAP salientes en dicha máquina y la receptora usa la clave privada para descifrarlos. Se usa la clase X509SecurityToken.
    • Kerberos: Es un protocolo propietario de Microsoft, mediante un servidor de este tipo el receptor verifica que el mensaje fué enviado por quie él espera. Se usa la clase KerberosToken.
    • UserNameToken: El más simple. Se usa la clase UserNameToken.
    • Binarios: Personalizados.
  • La autenticación permite la verficación del remitente y de los receptores de un mensaje.
  • La confidencialidad permite asegurar que unicamente podrán ver el mensaje entes autorizados.
  • La integridad asegura que un mensaje no ha sido alterado en la transmisión.
  • Los tokens pueden ser añadidos a la colección de tokens del objeto RequestSoapContext.
70-529 Resumen 8/13 : Depurando y distribuyendo aplicaciones remotas.
Octavo repaso de 13 del temario para el examen 70-529 requerido para obtener el MCTS: Distributed Applications, del libro oficial de Microsoft.
En verdad este es el capítulo 6 del libro, pero me parece más adecuado este orden.
  • Los objetos remotos estan contenidos en aplicaciones de consola, WinForms, servicios Windows ó aplicaciones ASP.NET.
  • Para distribuir un objeto remoto, puedes distribuir el ensamblado completo, el ensamblado con la interfaz que implementa el objeto remoto (recomendado) ó usar SoapSuds.exe para leer los metadatos del objeto remoto y generar un ensamblado en el cliente.
  • Si distribuyes un objeto remoto en una aplicación ASP.NET , deberias hacerlo a través de un proyecto de instalación Web.
  • Como un objeto remoto no puede ejecutarse por si mismo, para depurarlo hay que hacerlo a través de la aplicación que lo hospeda conectandola al depurador.
  • Con el depurador podemos conectarnos a un proceso remoto para poder realizar un depurado.
  • VS2005 puede depurar varios procesos al mismo tiempo pero solo uno puede ser visualizado a la vez, con la ventana de procesos podemos conmutar cual queremos ver.
  • La clase RemotingException se usa para representar excepciones disparadas por .NET Remoting.
  • .NET incluye e instala diversos contadores de rendimiento que se usan para seguir el rendimiento de aplicaciones remoting.
  • .NET incluye también la clase TrackingServices y la interfaz ITrackingHandler que permiten crear elementos de seguimiento de aplicaciones remoting personalizadas.
  • Los "lease objects" (objetos de contrato?) se usan para mantener una referencia al objeto remoto como si fuese un cliente para que el GC no recolecte dicho objeto.
  • Se inicializa sobreescribiendo el método InitializeLifetimeService en el objeto remoto.
  • Las propiedades del "lease object" han de configurarse antes de que se inicialize.
  • La interfaz ILease define la funcionalidad de un "lease object".
  • La duración del contrato puede ser extendida con el método ILease.Renew.
70-529 Resumen 7/13 : Invocación de métodos y gestión de eventos con .NET Remoting.
Séptimo repaso de 13 del temario para el examen 70-529 requerido para obtener el MCTS: Distributed Applications, del libro oficial de Microsoft.
En verdad este es el capítulo 8 del libro, pero me parece más adecuado este orden.
  • Los métodos de los objetos remotos se ejecutan de forma similar a como se hace en un objeto convencional pero se ejecutan en el servidor ó en el cliente dependiendo de si un objeto remoto se activa en el cliente ó en el servidor.
  • Se pueden realizar invocaciones asíncronas de métodos de un objeto remoto creando un delegado que cumpla la firma de dicho método y llamando a BeginInvoke, de esta forma podemos beneficiarnos de todas las ventajas del modelo asíncrono.
  • Mediante el atributo OneWay podemos implementar métodos con funcionalidad 'fire and forget' ("dispara y olvida" .. estos yankis.. siempre disparando...). Aunque este atributo protege al cliente de problemas en el servidor ó en la comunicación, no protege al servidor de exepciones en el código.
  • Si se usan interfaces en el ensamblado compartido entre cliente y servidor, el atributo ha de colocarse tanto en la interfaz como en la implementación (Recuerda, una interfaz simplemente es un contrato), porque Visual Studio 2005 no nos los pone al implementar la interfaz en la clase y el cliente no sabría que es 'OneWay'.
  public interface IInterfaz
  {
    [OneWay] 
     string Metodo1();
    [OneWay] 
     string Metodo2();
  }
 
    public class Clase : IInterfaz
    {
        #region IInterfaz Members
 
        [OneWay] 
        public string Metodo1()
        {
            throw new Exception("The method or operation is not implemented.");
        }
 
        [OneWay] 
        public string Metodo2()
        {
            throw new Exception("The method or operation is not implemented.");
        }
 
        #endregion
    }
  • Como siempre en el modelo asíncrono existen tres modelos de invocación, el primero, no indicando un AsyncCallback ni controlando cuando ha terminado la ejecución, el segundo, controlando la propiedad .IsCompleted para saber si ha acabado, y por último el tercero y más elegante, usando un AsyncCallback que nos informará de cuando ha terminado la ejecución.
  • Se pueden usar eventos en objetos remotos de forma similar a como se usan en objetos convencionales. De esta forma se provee de una comunicación bidirecional donde el cliente también hace de servidor y procesa acuses de recibo.
  • Debe utilizarse con mucha precaución. Reduce la escalabilidad, aumenta la complejidad del manejo de excepciones ya que ambas partes son servidor y cliente, las desconexiones pueden ser un problema ya que al reconectar se subscribe una nueva clase proxy al evento y el anterior queda ahí también, CAS no funciona entre procesos.
  • Nota Personal: Puedo dar fé del auténtico coñazo que es trabajar con eventos en remoting hasta que le cojes la forma. Lo más curioso es que aunque el libro menta el problema de los subscriptores fantasma a los eventos y el MSDN también ... no aporta soluciones. Si alguien tiene interés ... el artículo que fue mi faro en la penumbra sobre el tema .NET Remoting - Events. Events? Events!
  • Cualquier tipo (delegados, estructuras, clases,...) que vaya a utilizarse para comunicarse entre servidor y cliente debe ser serializable. Para ello se puede ornamentar con el atributo [Serializable].
70-529 Resumen 6/13 : Creando aplicaciones cliente con Remoting.
Sexto repaso de 13 del temario para el examen 70-529 requerido para obtener el MCTS: Distributed Applications, del libro oficial de Microsoft.
En verdad este es el capítulo 5 del libro, pero me parece más adecuado este orden.
  • Hay dos tipos de objetos remotos:
    • MarshalByValue: Son serializados en el servidor, transportados a la máquina cliente, deserializados y se comportan como objetos definidos localmente.
    • MarshalByRef: Reside en el servidor y las llamadas desde el cliente son transportadas a él.
  • Son más rápidos los MarshalByValue, pero tienen la desventaja de que no pueden acceder a los recursos del servidor al igual que los MarshalByRef.
  • Un objetos proxy es la representación un objeto remoto MarshalByRef, de forma que también parece un objeto local aunque resida en el servidor.
  • Hay dos tipos de proxies:
    • Proxy transparente: Es una especialización del proxy real.
    • Proxy Real: Se puede usar para crear proxies personalizados extendiendo su funcionalidad.
  • Cuando se usan los canales TCP ó HTTP es necesario indicar la URL donde se encuentra el objeto remoto.
  • Antes de que un objeto remoto pueda ser accedido, debe ser activado. .NET provee dos tipos de activación:
    • Activación en el servidor: Singleton y Singlecall
    • Activación en el cliente: Client-activated.
  • Configuración de aplicaciones remotas.
  • Muchas de las características de .NET Remoting pueden ser configuradas desde el archivo de configuración.
  • Esquema de la configuración remota.
  • Al igual que con los objetos convencionales, antes de llamar a un método de un objeto remoto es necesario instanciarlo con el operador new ó con el método Activator.GetObject.
70-529 Resumen 5/13 : Creando una aplicación servidor con Remoting.
Quinto repaso de 13 del temario para el examen 70-529 requerido para obtener el MCTS: Distributed Applications, del libro oficial de Microsoft.
En verdad este es el capítulo 4 del libro, pero me parece más adecuado este orden.
  • Remoting es una tecnología distribuida que permite pasar tipos de datos ricos y con fundamento de un dominio de aplicación a otro. Es más efectivo cuando el cliente y el servidor funcionan en .NET.
  • .NET 2.0 provee de tres tipos de objetos remotos:
    • Singleton: Se activa en el servidor y se usa cuando hay que mantener una información de estado entre llamadas y clientes. En terminos de rendimiento es mucho mejor ya que mantener el estado es mucho menos costoso que crear nuevos objetos cada vez.
    • SingleCall: Se activa en el servidor y se usa cuando no es necesario mantener un estado. Útil cuando se ha de balancear la carga entre los objetos. Se ejecuta un método por llamada y cuando se termina se destruye.
    • Client-activated: Se activa a petición del cliente obteniendo un objeto dedicado. Estos objetos son gestionados con una concesión de tiempo de vida que asegura que son destriuidos y no ocupan recursos innecesariamente.
  • Hay cuantro formas de hospedar un objeto remoto:
    • Aplicación de consola: Simple pero tosco y necesita se ejecutada manualmente.
    • Aplicación WinForms: Más visual pero también necesita más trabajo y también necesita ser ejecutada manualmente.
    • Aplicación Web: Puedes aprovecharte de todas las características de IIS y de la programación con ASP.NET pero claro, necesita IIS.
    • Servicio Windows: Mejor gestión de la aplicación en si pero es más complicado de depurar (Attach to process ;) ).
  • La aplicación que hospeda el objeto remoto es la responsable de registrar dicho objeto y el canal de comunicación.
  • Cuando se activa un objeto remoto, se genera un objeto proxy. Cuando y como depende de si se activa en el cliente ó en el servidor.
  • Hay tres canales sobre los que se pueden establecer comunicación con objetos remotos:
    • TCP: Con sockets y formateo binario, es el más rápido. Recomendado para redes locales.
    • HTTP: Sesiones http con formateo SOAP. Ideal para comunicación en internet.
    • IPC: Interprocesses Communication. Seguridad basada en ACLs.  Para usar en la misma máquina.
  • El único requisito para poder usar una clase como objeto remoto, es derivarla de MarshalByRefObject.
  • La clase RemoteConfiguration se usa para configurar de forma programática la aplicación servidora Remoting. Con esta clase se puede configurar las propiedades básicas del objeto remoto como el nombre de aplicación.
  • Para registrar objetos remotos activados en el servidor se usa RemotingConfiguration.RegisterWellKnowServiceType:
                //Registro objeto remoto Singleton
                RemotingConfiguration.RegisterWellKnownServiceType
                    (typeof(Server.MyRemoteClass), "MyRemoteClass1",
                    WellKnownObjectMode.Singleton);
                //Registro un objeto Client-activated
                RemotingConfiguration.RegisterActivatedServiceType
                    (typeof(Server.MyRemoteClass));
  • Si existen multiples versiones disponibles de un objeto remoto y quieres especificar una versión distinta a la última... necesitas especificar dicha versión cuando registras el objeto.
  • Los canales de comunicación se registran con ChannelServices.RegisterChannel y una instancia del canal que se quiere registrar. 
            //Registro un canal tp
            IChannel tcp = new TcpServerChannel(8090);
            ChannelServices.RegisterChannel(tcp, false);
 
            //Registro un canal http
            IChannel http = new HttpServerChannel(8006);
            ChannelServices.RegisterChannel(http, false);
 
            //Registro un canal icp
            IChannel ipc = new IpcServerChannel("ipcchannel");
            ChannelServices.RegisterChannel(ipc, false);
  • Se puede configurar el objeto remoto desde el archivo de configuración de la aplicación, pero hay que indicar el nombre del archivo:
            RemotingConfiguration.Configure("MyApp.exe.config", false);
Posted: ago 01 2007, 10:59 by vtortola | with no comments
Filed under: ,
70-529 Resumen 4/13 : Invocación de métodos y gestión de eventos en servicios web .NET
Cuarto repaso de 13 del temario para el examen 70-529 requerido para obtener el MCTS: Distributed Applications, del libro oficial de Microsoft.
En verdad este es el capítulo 7 del libro, pero me parece más adecuado este orden.
  • Visual Studio nos abstrae mucho trabajo al crear aplicaciones que consumen servicios web creando clases proxy que nos permiten trabajar con los métodos remotos como si de una clase en una dll convencional se tratase.
  • Podemos añadir una haciendo un 'Add Web Reference' y pasandole el WSDL junto el nombre que queremos darle a la referencia. Usando el ejemplo de WS del resumen anterior, he creado una llamada 'referenciaWeb' y usarla en el código es tan simple como esto:
using System;
using System.Collections.Generic;
using System.Text;
using TestWebServiceConsumer.referenciaWeb;
 
namespace TestWebServiceConsumer
{
    class Program
    {
        static void Main(string[] args)
        {
            TestWebService test = new TestWebService();
 
            Console.WriteLine(test.ProbandoObjetoApplication().ToString());
 
            Console.ReadKey();
        }
    }
}
  • Visual Studio genera una serie de archivos, entre ellos Reference.cs que contiene el código de dicha clase proxy que utilizaremos para comunicarnos con el servicio web:

referenciaWeb

  • En caso de que cambie el servicio web, es necesario realizar un 'Update Web Reference' para volver a generar la clase proxy y de esta forma actualizar sus miembros. Procura no realizar cambios demasiado bruscos cuando se trate de modificar un servicio web, sobre todo no cambies las firmas de los métodos.
  • Podemos invocar servicios web de forma asíncrona siguiendo el modelo event-driven (basado en eventos) gracias a los métodos que la clase proxy genera para ellos (estos chicos de Microsoft, están en todo!!... menos en los bugs xD). El método con el sufijo 'Async' se usa para invocar de forma asíncrona y el evento con el nombre del método y el sufijo Completed es al que nos debemos suscribir para recibir los resultados. También se crea una clase <NombreDelMetodo>CompletedEventArgs donde nos llegarán los datos y otra información útil. Podemos canclear una operación asíncrona pasandole el userState de la operación. El ejemplo plasma todo esto:
        static void Main(string[] args)
        {
            TestWebService test = new TestWebService();
            
            // Me suscribo al evento
            test.ProbandoObjetoApplicationCompleted += 
                new ProbandoObjetoApplicationCompletedEventHandler(test_ProbandoObjetoApplicationCompleted);
 
            // Lanzo dos operaciones asíncronas
            for(int i=0;i<2;i++)
                test.ProbandoObjetoApplicationAsync(i);
 
            // Cancelo la primera
            test.CancelAsync(0);
 
            Console.ReadKey();
        }
 
        static void test_ProbandoObjetoApplicationCompleted(object sender, ProbandoObjetoApplicationCompletedEventArgs e)
        {
            if (!e.Cancelled) // Todo fue correcto :)
                Console.WriteLine("{0} devuelve {1}", e.UserState, e.Result);
            else if (e.Error != null) // Hubo una excepción!!
                Console.WriteLine("{0}:{1}",e.Error.GetType().Name, e.Error.Message);
            else // Se canceló la operación programáticamente
                Console.WriteLine("{0} Cancelada!!", Convert.ToInt32(e.UserState));
        }
  • Siempre es recomendable usar este modelo, ya que si una excepción no manejada sucediese en el servicio web, el cliente no se enteraria y quedaría esperando hasta el timeout.
  • Podemos hacer que los clientes de un servicio web no tengan que esperar a la finalización de un método web indicando en este que es 'OneWay' como se indicaba en el resumen anterior, de esta forma ni valores de retorno ni excepciones pueden ser devueltas, lo cual puede enmascarar problemas más graves.