Logger WPF en tiempo real de una web Asp.net MVC con SignalR y NLog

viernes, 13 de diciembre de 2013


En un post anterior ya vimos una introducción a SignalR y un ejemplo de un chat, en este post comenté que en SignalR también era posible un cliente no solo en javascript sino también en un proyecto .Net.

Pues bien en esta ocasión vamos a crear un proyecto sencillo de Asp.Net MVC que levantará un servidor SignalR y vamos a crear un target personalizado de NLog que mediante SignalR que envíe los mensajes a los clientes que haya conectados, para este ejemplo vamos a crear un logger sencillo en WPF como cliente que se actualizará en tiempo real.

Introducción a SignalR y el clásico ejemplo de un chat

viernes, 6 de diciembre de 2013

Introducción

SignalR es un librería open source inicialmente creada por Damian Edwards y David Fowler y que ahora forma parte de la familia de Asp.Net. Mediante SignalR podemos añadir funcionalidad de tipo comunicación en tiempo real entre cliente y servidor, teniendo así una comunicación bidireccional.

Esta disponible mediante NuGet, esta muy integrado con proyectos Asp.net. En pocos pasos mediante su API se puede crear una aplicación web donde desde el lado del servidor se puede invocar funciones declaradas en un cliente javascript en el navegador.

JavaScript & JQuery: Interactive Front-End Web Development by Jon Duckett en preventa

domingo, 17 de noviembre de 2013


Hace poco escribí un post sobre un libro de html y css que me gustó mucho por su diseño y lo agradable que era su lectura así como el aprendizaje con él, se trata de HTML and CSS: Design and Build Websites de Jon Duckett.

En Amazon esta en preventa la versión de este libro para javascript, si la linea del libro de html y css se cumple en este para javascript lo convierte en un libro muy recomendado. La fecha de lanzamiento del libro es Enero 2014.

Pruebas unitarias con Moq

sábado, 16 de noviembre de 2013

Moq es un framework para crear mocks en .Net, se puede descargar mediante NuGet y actualmente tiene unas 700.000 descargas lo que indica la popularidad de este framework frente a otros que se pueden descargar también mediante NuGet.
Utiliza linq con expresiones lambda lo que lo hace muy flexible y productivo.

Antes de empezar con un ejemplo utilizando moq, voy a repasar terminología de TDD.

Cuando usar Interface y cuando una clase base

domingo, 10 de noviembre de 2013

¿Cuando usarías Interface y cuando una clase base? es una tipica pregunta sobre programación orientada a objetos, incluso para entrevistas de trabajo y voy a contaros mi punto de vista.

El objetivo de una interface es un contrato que las clases que lo implementan deben cumplir y una clase base tiene como objetivo re-utilización de código entre clases comunes y a su vez mediante métodos abstractos también es un contrato para sus clases derivadas, deben implementar esos métodos las clases derivadas para evitar error de compilación. También con ambas opciones se puede realizar polimorfismo.

Una clase base puede ser abstracta o no, si es abtracta no se puede instanciar.

HTML and CSS: Design and Build Websites de Jon Duckett (@htmlandcssbook)

domingo, 3 de noviembre de 2013

HTML and CSS: Design and Build Websites es un libro muy recomendado para aquellas personas que se quieran adentrar en el mundo web.



Es un libro que desde el principio te das cuenta que tiene un enfoque distinto de lo habitual, lo común en los libros de informática es que su diseño parezca un manual de instrucciones en blanco y negro, sin embargo este libro tiene muy cuidado su diseño, es en color, los ejemplos son muy claros y muy visuales lo que hace la lectura del libro muy agradable.

Margin Collapsing en CSS

domingo, 27 de octubre de 2013

Margin Collapsing en css es un efecto que se produce cuando el margen vertical de dos elementos se tocan, como consecuencia se fusionan en uno solo y pasa a formar parte de uno de los elementos, dejando el otro sin margen. El tamaño del margen colapsado se corresponderá con el de mayor tamaño.
Este comportamiento es bueno para texto como párrafos, títulos pero hay otras circunstancias donde no será el resultado esperado.
Margin Collapsing no se producirá cuando existan elementos con borde,flotantes, con padding, con posición absoluta, inline-block, con overflow diferente de visible.
Vamos a ver unos ejemplos donde se produce.

Introducción a la Programación Orientada a Aspectos (AOP) con Postsharp (@postsharp).

miércoles, 23 de octubre de 2013


La programación orientada a aspectos (AOP  Aspect Oriented Programming) es un paradigma de programación cuyo objetivo es reducir el código duplicado que suele existir en relación a los aspectos trasversales de una aplicación como creación de logs, control de excepciones, gestión de cache, temas de seguridad.

A mi forma de entender la programación orientada aspectos comparado con la programación orientada a objetos, es que esta última con las clases base permite la reutilización de código entre componentes comunes y la programación orientada a aspectos con atributos permite la reutilización de código entre componentes no comunes.

Gestión de imágenes rotas con JavaScript

sábado, 19 de octubre de 2013

Logo JavaScript

En ocasiones las urls de las imágenes dan error y se quedan rotas, la sensación de cara al usuario no es muy buena. Para minimizar la mala sensación del usuario podemos reemplazar en caso de error la url de la imagen original por otra imagen por defecto o podemos ocultarla.

Problemas de rendimiento en procedimientos almacenados con parámetros - Parameter Sniffing

miércoles, 16 de octubre de 2013


En SQL Server los procedimientos almacenados tienen un comportamiento por defecto , se llama parameter sniffing.

Cuando un procedimiento almacenado es compilado o recompilado y se ejecuta por primera vez, el valor de los parámetros que recibe es utilizado para calcular el plan de ejecución más óptimo y este es almacenado en cache. En futuras ejecuciones el plan de ejecución no es calculado, sino que se utiliza el almacenado en cache según el valor de los parámetros de la primera ejecución después de la compilación.

Ejemplo menu responsive

domingo, 13 de octubre de 2013

El diseño web responsive esta a la orden del día y cada vez es más común ver webs que lo están usando y se agradece.

Vamos a ver como crear un menú responsive.

Aprender Inyección de Dependencias con Mark Seemann (@ploeh)

viernes, 11 de octubre de 2013




Cuando me decidí a aprender sobre inyección de dependencias empece a buscar información sobre libros, artículos que cubrieran el tema pero lo que encontraba era bastante sencillo o el típico hello word y no terminaba de convencerme.
Finalmente conseguí entender la lógica de la inyección de dependencias como para atreverme a hacer un ejemplo, la cosa estaba clara, una de las formas de pasar a una clase sus dependencias es a través del constructor, pero ¿quien debería crear las clases y pasar las dependencias a cada una?, fue entonces cuando me encontré con el articulo de Mark Seemann sobre CompositionRoot.
A través de este blog decubrí su libro Dependency Injection in .Net, no se si el mejor libro sobre inyección de dependencias para .net, porque seguro que no investigue todos, pero sin duda el que más me ayudo con este tema en ese momento.

Como Alinear 3 Div a la izquierda centro y derecha

miércoles, 9 de octubre de 2013

En ocaciones en html tenemos la necesidad de organizar el contenido de un contenedor a la derecha , izquierda y centro. Por ejemplo en un header podemos querer un logo a la izquierda, menú en centro y caja de búsqueda a la derecha.

Vamos a ver un ejemplo.

Meta Tag Viewport

domingo, 6 de octubre de 2013

Esta etiqueta inicialmente fue creada por Apple para identificar como se visualizaría una página web en el iphone pero hoy día se ha convertido en un estándar del desarrollo web móvil y para el diseño web responsive

Testear javascript, html y css con JsFiddle

jueves, 3 de octubre de 2013

JsFiddle es una herramienta online para testear html, javascript y css, incluso se pueden utilizar librerías como JQuery o AngularJS entre otras.

Viene muy bien para puebas o demos.

Ademas se puede grabar el trabajo realizado y compartirlo mediante una url, en un blog por ejemplo.

Aqui os dejo el enlace jsfiddle






Patterns of Enterprise Application Architecture de Martin Fowler nunca pasa de moda

martes, 1 de octubre de 2013



Como dice el título el libro Patterns of Enterprise Application Architecture nunca pasa de moda, este libro tiene ya 10 años, lo tengo desde 2008 y siempre que le hecho un vistazo descubro algo nuevo, algo que en su día paso desapercibido para mi o simplemente que no estaba preparado para comprender en ese momento.

Asp.net Web Forms y Asp.net MVC trabajando juntos

jueves, 19 de septiembre de 2013



En este post vamos a ver los pasos que tenemos que dar para añadir paginas Asp.net MVC a un proyecto Asp.net Web Forms, lo cual puede ser muy útil para migrar un proyecto poco a poco.

Lo primero que vamos a hacer es crear un proyecto web forms.


Paso 1 - añadimos la referencias necesarias para MVC que son
  • System.Web.MVC , aqui se encuentra el motor de MVC
  • System.Web.Routing, aquí se encuentra el motor que permite enlazar paginas según una ruta virtual y no ruta física de la página.
  • System.Web.Razor y System.WebPages.Razor para poder añadir páginas con motor Razor.
Paso 2 - añadimos las carpetas Controllers y Views al proyecto porque Asp.net mvc por convención va a buscar en esta carpetas, este comportamiento puede ser modificado, es así por defecto.

Paso 3 - configuramos el sistema de  routing por defecto para las paginas MVC, aquí se pueden definir routing para las paginas Web Forms también o dejar que se invoquen directamente con la ruta física.
Para crearlo los más parecido a un proyecto asp.net MVC modificamos la clase RouteConfig, añadiéndole using para System.Web.MVC para poder hacer routing MVC y dejando la clase así:

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
           routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
Con esto le estamos indicando que las rutas de MVC son nombre del controlador / nombre de la Action / Id y además que si solo se indica el host, el controlador por defecto es Home y la acción por defecto que es Index.
También le indicamos al routing de mvc que ignore las rutas de ficheros aspx.

En este fichero routing pueden convivir routing de paginas web forms y de paginas mvc. Para web forms usaremos MapPageRoute especificando la ruta física del fichero y para MVC usaremos MapRoute y usará la convención por defecto para buscar los ficheros en las carpetas Controllers y Views.

Paso 4 - Para seguir la misma estructura que un proyecto MVC , ahora creamos dentro de la carpeta App_Start una clase FilterConfig.

    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    }

De esta forma añadimos el filtro de manejo de errores por defecto de MVC, donde podemos indicar entre otras cosas la pagina que se muestra cuando se produce un error.

Paso 5 - Añadimos en el Application_Start del fichero Global.asax las llamadas a los config que hemos creado

     AreaRegistration.RegisterAllAreas()
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
     RouteConfig.RegisterRoutes(RouteTable.Routes);

Paso 6 - Modificar web config añadiendo configuraciones necesarias para mvc


Añadir esta sección AppSettings
   
  
    
    
    
    
    
  
Modificamos la seccion compilation dentro de system.web
   
    
      
        
        
        
        
        
      
    

Y dentro de la seccion System.Web añadimos la seccion pages
   
    
      
        
        
        
        
        
        
      
    

Y añadimos las redirecciones para System.Web.Helpers, System.Web.Mvc, System.Web.WebPages a la versión referenciada por el proyecto para que los asemblies compilados a versiones anteriores funcionen con la versión más reciente.
   
      
        
        
      
      
        
        
      
      
        
        

Por último dentro de la carpeta views, tenemos que añadir este web.config, que es el que se añade por defecto en un proyecto Asp.net MVc dentro de esta carpeta
   



  
    
      

Paso 7 - Para que se comporte como un tipo de proyecto MVC y aparezcan acciones de añadir controlador etc.. tenemos que modificar el fichero del proyecto con un editor de texto como notepad por ejemplo y sustituir esta linea.

<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>

por esta otra

<ProjectTypeGuids>{E3E379DF-F4C6-4180-9B81-6769533ABE47};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>

Añadiendo en guid {E3E379DF-F4C6-4180-9B81-6769533ABE47} antes, ya se va a comportar como un proyecto Asp.net MVC. Este guid depende de la versión de MVC, en este caso es la 4.

Ahora ya podemos añadir un controlador y su vista correspondiente tanto con motor aspx como con motor razor y ya debería funcionar.