Blog de Jorge Pedraza

enero 23, 2012

Unicidad de Acceso de Usuario en ASP.NET

Archivado en: Aplicaciones Web,Seguridad — JorgePedraza @ 6:14 am
Tags:

Hola, el presente artículo tiene como finalidad resaltar una técnica fácil y sencilla de implementar para validar la unicidad de acceso de cuentas de usuarios contra determinada solución ASP.NET.

La idea principal es reproducir y validar el escenario de cuando uno o más usuarios inician sesión con una misma cuenta de usuario (Login y Password) de forma concurrente o recurrente, contra determinada sitio web de ASP.NET a través de la autenticación por formulario.

Un ejemplo clásico de esto es el sistema Login Windows Live  ID de Hotmail, el cual lleva un mecanismo bien estructurado para permitir múltiples variantes de Login con una determinada cuenta de usuario.

Entonces a continuación se detalla la técnica.
Requisitos:
1.    Microsoft Visual Studio 2010 con SP 1
2.    Experiencia con Lenguaje Visual Basic 2010 o C# 2010
3.    Conocimiento fundamental de Autenticación por formulario de ASP.NET

Elementos claves de la técnica de Unicidad:
1.    Soporte de Autenticación por formulario de ASP.NET
2.    Objeto Application de ASP.NET
3.    Objeto Session de ASP.NET
4.    Propiedad SessionID del Objeto Session (HttpSessionState)

Descripción de la técnica de Unicidad:
Por defecto la técnica se enfoca en mantener un registro de los usuarios autenticados de forma global a través de objeto Application para ser usado en combinación con el Objeto Session de cada usuario anónimamente único.
Para estos se inicia con el formulario Login.aspx, donde una vez validado el usuario se procede a usar el siguiente fragmento de código:

Dim iduser As String = “1”
Dim cadusuario As String = “Demo”

Me.Session("usuario") = cadusuario
Me.Session("id_usuario") = iduser

Application.Lock()
If Application.Item(iduser) Is Nothing Then
    Application.Add(iduser, Me.Session.SessionID.ToString)
Else
    Application.Item(iduser) = Me.Session.SessionID.ToString
End If
Application.UnLock()
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(cadusuario, False)

 

Ahora desde determinada página formulario WebForm o página maestra Site.Master se puede usar el evento Init para colocar el siguiente código:

If Session("id_usuario") Is Nothing OrElse Application(Session("id_usuario")) <> Me.Session.SessionID.ToString() Then
   ‘CerrarSesion()
   lblmensajemain.Text = "Atención otro usuario ha iniciado sesión con la actual cuenta de Usuario, consulte con el Administrador"
End If

Finalmente se concreta la técnica, la cual puede llegar a ofrecer a los usuarios una advertencia o cierre abrupto de la sesión dejando en teoría solo la última sesión activa valida vinculado con determinada cuenta de usuario autenticado.

Nota Importante: Esta técnica fue probado en diferentes navegadores, entornos y frecuencias de tiempo, el cual ha obtenido excelente resultado. De toda manera si usted presenta alguna anomalía, por favor póngase en contacto conmigo para estudiar toda alternativa de reestructuración de la misma.

Código fuente:

En Resumen:

Esta alternativa permite construir soluciones Web más escalable y segura sin necesidad de recurrir a complejo mecanismo de persistencias de datos, para hacer seguimiento de sesiones de usuarios autenticados de forma consistente.

Enlaces de Interés:

  1. HttpSessionState Class
  2. HttpSessionState.SessionID Property
  3. HttpApplicationState Class
  4. How to: Implement Simple Forms Authentication

diciembre 12, 2011

Transformación de Web.Config

Archivado en: Aplicaciones Web — JorgePedraza @ 6:15 am
Tags:

 

Hola la presente de este articulo es para resaltar de forma rápida y precisa la característica Transformación de Web.Config disponible dentro de Visual Studio 2010.

Índices:

  1. Requisitos.
  2. Transformación de Web.Config.
  3. Como funciona Transformación de Web.Config.
  4. Pasos Claves para Transformar Web.Config.
  5. Transformar Web.Config basado en Perfil personalizado.
  6. Código fuente.
  7. Enlaces de Referencia.

1. Requisitos:

  • Visual Studio 2010
  • Conocimientos sobre desarrollo ASP.NET 2.0 o Superior

2. Transformación de Web.Config:

Es una característica equipada dentro de Visual Studio 2010 el cual permitir mantener diferentes versiones de Web.Config dentro de un proyecto del tipo ASP.NET para usar de forma selectiva en la fase de implementación de dicho proyecto.

3. Como funciona Transformación de Web.Config:

Dentro de un proyecto ASP.NET desde Visual Studio 2010, se puede encontrar por defecto 3 archivos Web.Config anidados (Web.Config, Web.Debug.Config, Web.Release.Config), donde los dos últimos mencionado contiene ConnectionStrings por defecto en comentarios, para los cuales se encuentra atributos especiales (xdt:Transform="SetAttributes" y xdt:Locator="Match(name)") dentro de su elemento.

Entonces la idea principal es quitar los comentarios del ConnectionStrings de cada Web.Config y hacer coincidir su nombre (name) para realizar la actualización de valores de ConnectionString en la fase de implementación de acuerdo al perfil de construcción establecido, por ejemplo (Debug o Release).

4. Pasos claves para Transformar Web.Config:

1. Identificar y configurar las versiones por defecto del Web.Config con los ConnectionStrings deseados. 2. Publicar Solución seleccionado determinado Perfil de publicación.
Paso1 Paso2
   
3. Pulsar Botón Publish (Publicar) para genera resultado final bajo el modo de generación, en este caso Debug. 4. Verificar el Web.Config dentro del resultado de publicación.
Paso3 Paso4
   

5. Transformar Web.Config basado en Perfil personalizado:

1. Crear un perfil de construcción, por ejemplo llamado Inicio. 2. Pulsar botón derecho del ratón sobre el Web.Config raíz, luego se da clic sobre la opción Add Config Transforms.
Perfil1 Perfil2
   
3. Identificar y configurar el archivo Web.Inicio.Config, con el ConnectionString deseado. 4. Publicar (Publish) el resultado final basado en el Perfil de construcción Inicio y verificar el Web.Config dentro del resultado de publicación.
Perfil3 Perfil4

Recuerde que para continuar la ejecución y prueba normal del proyecto, se sugiere usar el perfil de construcción tanto Debug o Release.

6. Código Fuente:

7. Enlaces de Referencia:

noviembre 14, 2011

Usando WorkFlows desde ASP.NET 4.0

Archivado en: Aplicaciones Web — JorgePedraza @ 6:03 am
Tags:

 

Hola la presente de este articulo es para resalta de forma general el tema de WorkFlow con un enfoque sobre aplicaciones Web de ASP.NET.

Índices:

  1. WorkFlow
  2. Estilos de Creación de WorkFlow.
  3. Elementos de un WorkFlow.
  4. Motor de tiempo de ejecución del WorkFlow
  5. Pasos básico para iniciar solución ASP.NET con WorkFlow
  6. Descripción Solución de Ejemplo Test WorkFlow ASP.NET
  7. Descripción Solución de Ejemplo Hosting WorkFlow in ASP.NET
  8. Códigos Fuentes.
  9. Puntos de Interés de WorkFlow para su estudio.
  10. En Resumen.
  11. Enlaces de Referencia

1. WorkFlow: Flujo de Trabajo

Un WorkFlow es un conjunto de unidades de trabajos elementales llamadas actividades que están almacenadas como un modelo que describe un proceso real. Los WorkFlow proporcionan una manera de describir el orden de ejecución y las relaciones de dependencia entre las partes de trabajo de ejecución corta o prolongada. Este trabajo pasa a través del modelo desde el principio hasta el final y las actividades pueden ser ejecutadas por personas o por funciones de sistema.

2. Estilos de Creación de WorkFlow

  • WorkFlow Secuencial: Este WorkFlow consta de un conjunto de actividades que se ejecuta de forma secuencial, uno por uno hasta que finalice la última actividad. También a dicho WorkFlow se puede agregar actividades compuesta por defecto o personalizada. Ejemplo de WorkFlow Secuencial:

  • WorkFlow Maquina de Estado: Este WorkFlow consta de un conjunto de Estados. Cada estado puede recibir un determinado conjunto de eventos. Basado en un evento, es posible una transición a otro Estado. El WorkFlow de máquina de Estado tiene un estado Inicial y puede tener un estado final. Cuando se realiza una transición al estado final, se completa el WorkFlow. Ejemplo de WorkFlow Maquina de Estado:

3. Elementos de un WorkFlow:

Elementos de WF 4 Descripción
Control Flow (Flujo de Control)
DoWhile Ejecuta una actividad contenida, mientras una condición es true.
ForEachT Recorre una lista y ejecuta un actividad contenida para cada elemento en la lista.
IF Ejecuta Actividades contenidas basado en una condición especificada.
Parallel Ejecuta Actividades contenidas en paralelo.
ParallelForEach Recorre una lista y ejecuta una actividad contenida en paralelo para cada elemento en la lista.
Pick Suministra un modelado de flujo de control basado en evento en un WorkFlow
PickBranch Rama en una actividad Pick
Sequence Un flujo de control que ejecuta actividades secuencialmente.
SwitchT

Ejecuta uno de sus hijos en función del resultado de una expresión

While Ejecuta una actividad contenida, mientras una condición es true.
Flowchart (Diagrama de Flujo)
FlowChart2 Permite modelado de procesos con una sola ruta de ejecución y bucles hacia los puntos previos de ejecuciones.
FlowDecision Rama condicional en un diagrama de flujo (Flowchart)
FlowSwitch Selecciona el próximo nodo in Diagrama de flujo (Flowchart) dependiendo sobre el valor de una expresión.
State Machine (Maquina de estado)
State Representa un estado en una maquina de estado.
StateMachine2 Permite modelado de procesos con un enfoque orientado a eventos
FinalState Representa un estado final una maquina de estado.
Messaging (Mensajería)
CorrelationScope Ejecuta un conjunto de actividades de mensajerías debajo de la misma correlación.
InitializeCorrelation Inicializa una nueva correlación.
Receive Recibe un mensaje Windows Communications Foundation (WCF).
ReceiveAndSendReply Recibe un mensaje Windows Communications Foundation (WCF) y envía una respuesta al remitente.
Send Envía un mensaje Windows Communications Foundation (WCF).
SendAndReceiveReply Envía un mensaje Windows Communications Foundation (WCF) y espera por un respuesta.
TransactedReceiveScope Envía un mensaje Windows Communications Foundation (WCF) con transacción y ejecuta actividades debajo de esa transacción.
Runtime (Tiempo de Ejecución)
Persist Guarda un WorkFlow.
TerminateWorkFlow Termina la ejecución de un WorkFlow
Primitives (Primitivos)
Assign Asigna un valor a una variable o argumento.
Delay Ejecuta un retardo para una cantidad especificada de tiempo.
InvokeMethod Invoca un método sobre un tipo o objeto CLR.
WriteLine Escribe texto a un TextWriter.
Transaction (Transacción)
CancellationScope Ejecuta una actividad contenida y permite proveer una lógica de cancelación.
CompensableActivity Defina una unidad de trabajo el cual puede ser compensada o confirmada en cualquier punto después de la finalización correcta.
Compensate Invoca el manejador de compensación de una actividad de compensación.
Confirm Invoca el manejador de confirmación de una actividad de compensación.
TransactionScope Ejecuta una actividad contenida debajo de una transacción.
Collection (Colección)
AddToCollectionT Agrega un elemento a una colección.
ClearCollectionT Limpia una colección.
ExistsInCollection Retorno true Sí un elemento existe en la colección.
RemoveFromCollectionT Remueve un elemento de una colección.
Error Handling (Control de Errores)
Rethrow Vuelve a producir una excepción en un Catch.
Throw Lanza una excepción en un WorkFlow.
TryCatch Proporciona manejos de errores en un WorkFlow.

4. Motor de tiempo de ejecución del WorkFlow:

  • Una clase WorkflowInvoker, que invoca el flujo de trabajo como si se tratara de un método.
  • Una clase WorkflowApplication para el control explícito de la ejecución de una única instancia de flujo de trabajo.Una
  • Una clase WorkflowServiceHost para las interacciones basadas en mensajes en escenarios de varias instancias.

Cada una de estas clases ajusta el tiempo de ejecución de la actividad principal, representado como una clase ActivityInstance responsable de la ejecución de la actividad. Puede haber varios objetos ActivityInstance ejecutándose simultáneamente dentro de un dominio de aplicación.

Los tres objetos de interacción de host anteriores se crean a partir de un árbol de actividades al que se hace referencia como programa de flujo de trabajo. Con estos tipos o con un host personalizado que ajuste la clase ActivityInstance, los flujos de trabajo se pueden ejecutar dentro de cualquier proceso de Windows, incluidos las aplicaciones de consola, las aplicaciones basadas en formularios, los Servicios de Windows, los Sitios web de ASP.NET y los servicios de Windows Communication Foundation (WCF).

5. Pasos básico para iniciar solución ASP.NET con WorkFlow :

1. Crear Proyecto ASP.NET Web Application 2. Agregar Nuevo elemento Activity de WorkFlow llamado ActivityAritmetica al proyecto ASP.NET 3. Diseñar y Desarrollar WorkFlow para dar operación aritmética a dos numero.
Paso1 Paso2 Paso3
     
4. Diseñar interfaz de usuario web en Default.aspx con entradas y salida de datos de ActivityAritmetica 5. Introducir Código en el botón igual, para invocar ActivityAritmetica con su parámetros de entrada y salida. 6. Compilar y probar la solución de ASP.NET.
Paso4 Paso5 Paso6
     

6. Descripción Solución de Ejemplo Test WorkFlow ASP.NET :

Se trata de la función Cifrado .NET llevada a la versión WorkFlow la cual es consumida desde Aplicación Web de ASP.NET

1. Diseño y Desarrollo WF 2. Generación 3. Consumo
WFCifradoNET WFCifradoNETDLL WFCifradoNETASPNET

7. Descripción Solución de Ejemplo Hosting WorkFlow in ASP.NET :

Se trata de una solución que involucra 3 proyectos (Actividad de Envió de Email, Servicio WCF para Envío de Email, Aplicación Web de ASP.NET). Esta solución tiene finalidad de Enviar Email desde Aplicación cliente (ASP.NET) a través de un series elementos Workflow enlazado como un servicio WCF y biblioteca de proceso. Aquí es importe paremetrizar correctamente (From, host, password, subject, to, UserName) de la actividad SendEmailActivity contenida en el WorkFlow del Servicio WCF de Envío de Email, para obtener resultado satisfactorio.

1. Actividad de Envío de Email 2. Servicio WCF de Envío de Email 3. Consumo de Servicio WCF Email
WFSendEmailActivityDesigner WFSendEmailService WFEnviarEmailASPNET

WFSendEmailActivityDesignerDLL

WFSendEmailServiceRun WFEnviarEmailASPNETrun

8. Códigos Fuentes:

9. Puntos de Interés de WorkFlow para su estudio:

  1. Diseñar e implementar actividades personalizadas.
  2. Modelo de datos de Windows Workflow Foundation.
  3. Esperar entrada en un flujo de trabajo.
  4. Excepciones, transacciones y compensación.
  5. Hospedar de WorkFlow.
  6. Servicios de WorkFlow.
  7. Persistencia del WorkFlow.
  8. Migrar WorkFlow.
  9. Seguimiento y traza del WorkFlow
  10. Seguridad del WorkFlow

10. En Resumen:

Windows Workflow Foundation (WF) genera el nivel de abstracción para desarrollar aplicaciones interactivas de ejecución prolongada. Las unidades de trabajo se encapsulan como actividades. Las actividades se ejecutan en un entorno que proporcione los medios para el control de flujo, el control de excepciones, la propagación de errores, la persistencia de los datos de estado, la carga y descarga de flujos de trabajo en progreso de la memoria, el seguimiento y el flujo de la transacción.

11. Enlaces de Referencia:

septiembre 4, 2011

Maestro Detalles ADO.NET en WPF

Archivado en: Aplicaciones Windows — JorgePedraza @ 10:17 am
Tags:

Hola, el presente artículo intenta resaltar de forma rápida y sencilla el desarrollo de una aplicación de datos de última generación (Aplicación Maestro Detalles) donde involucra tecnologías actuales de Microsoft .

Esta aplicación de ejemplo del tipo Windows está comprendida en tres aspectos de interés como: presentación grafica de la aplicación para el usuario (WPF Windows Presentation Foundation), Manipulación de datos (ADO.NET) y finalmente repositorio de datos (SQL Server Compact 4.0).

Con esta información se busca ofrecer una base fundamental para el desarrollo y expansión de soluciones en diferentes escenarios de forma genérica como es el caso de otros motores de base de datos y aplicaciones relacionadas con tecnologías.

Índice:

  1. Requisitos.
  2. Conceptos Claves para este Articulo.
  3. Diagrama entidad relación de Base Datos del Ejemplo (Maestro Detalles).
  4. Esquema del Documento (Document Outline) – Aplicación Demo WPF.
  5. Arquitectura de la Aplicación WPF con Maestro Detalles ADO.NET.
  6. ItemTemplate de ListBox WPF
  7. Representación y enlaces de ItemTemplate del ListBox desde XAML.
  8. Código de Aplicación Maestro Detalles ADO.NET en WPF
  9. Código Fuente.
  10. En Resumen.
  11. Enlaces de Interés.

1. Requisitos:

  1. Microsoft Visual Studio 2010 SP 1
  2. Microsoft Visual Studio 2010 SP1 Tools for SQL Server Compact 4.0
  3. Experiencia con Microsoft Visual Basic 2010 o C# 2010
  4. Experiencia con ADO.NET

2. Conceptos claves para este Articulo:

  • WPF: Windows Presentation Foundation (WPF) es un sistema de presentación grafica de ultima generación para construir aplicaciones clientes Windows con experiencias de usuario visualmente impresionantes.
  • XAML: Es un lenguaje de marcado basado en XML, que se utiliza para implementar la apariencia de una aplicación de forma declarativa.
  • SQL Server Compact 4.0 : Es una base de datos compacta ideal para incrustarse en aplicaciones de escritorio y web. Este ofrece funcionalidad de base de datos relacional en un espacio reducido: un sólido almacén de datos, un procesador de consultas de optimización y una conectividad confiable y escalable.
  • DataSet : Es un caché de memoria interna de datos y representa un componente fundamental de la arquitectura de ADO.NET. Un DataSet puede contener uno o más tablas llamadas DataTable que a su ves puede ser relacionadas por uno o más objetos de relación llamados DataRelation.

3. Diagrama entidad relación de Base Datos del Ejemplo (Maestro Detalles):

EntidadRelacionDB

4. Esquema del Documento (Document Outline) – Aplicación Demo WPF:

XAMLyDesign Document OutlineWPF
     

Descripción a nivel de XAML

Window:     Representa una Ventana de la aplicación Windows
  Resources:   Forma sencilla de reutilizar objetos y valores comúnmente definido.
    DataSet (myds) Elemento proxy establecido para el objeto mydscode del tipo DataSet
    CollectionViewSource (EncDocViewSource) Elemento proxy establecido para el objeto MasterEncDocViewSource del tipo CollectionViewSource.
    CollectionViewSource (EncDoc_DetDocViewSource) Elemento proxy establecido para el objeto DetailEncDoc_DetDocViewSource del tipo CollectionViewSource.
  Grid:   Define un área de cuadrícula flexible que se compone de filas y columnas.
    ListBox (lbxEncDoc) Caja de Lista para mostrar datos del DataTable (EncDoc)
    Button (btnProximoEncDoc) Botón para invocar instrucción próximo registro dentro del MasterEncDocViewSource.View
    TextBox (txtNombre) Caja de Texto para mostrar o establecer datos en el campo Nombre del DataTable (EncDoc)
    Button (btnNuevoEncDoc) Botón para invocar instrucción Nuevo Registro dentro del MasterEncDocViewSource.View
    ListBox (lbxDetDoc) Caja de Lista para mostrar datos del DataTable (DetDoc)
    Button (txtCifra) Caja de Texto para mostrar o establecer valor numérico en el campo Cifra del DataTable (DetDoc)
    Button (btnNuevoDetDoc) Botón para invocar instrucción Nuevo Registro dentro del DetailEncDoc_DetDocList.View
    Button (btnQuitarDetDoc) Botón para invocar instrucción Quitar Registro actual dentro del DetailEncDoc_DetDocList.View
    Button (btnUpdate) Botón para invocar rutina de actualización de datos contra el origen de datos.
    Button (btnQuitarEncDoc) Botón para invocar instrucción Quitar Registro actual dentro del MasterEncDocViewSource.View
    Button (btnBuscar) Botón para invocar rutina de filtro de datos
    Button (btnTodos) Botón para invocar instrucción Quitar filtro de datos
    Button (btnOrdenar) Botón para invocar instrucción de ordenación de datos.

5. Arquitectura de la Aplicación WPF con Maestro Detalles ADO.NET:

FlujoAr

6. ItemTemplate de ListBox WPF:

ItemTemplateAndAppWPF

         

Descripción a nivel de XAML

ListBox(lbxEncDoc)         Caja de Lista en WPF
  ItemTemplate       Obtiene o establece el DataTemplate utilizado para mostrar cada elemento.
    DataTemplate     Describe la estructura visual de un objeto de datos.
      Grid   Define un área de cuadrícula flexible que se compone de filas y columnas.
        ColumnDefinition Define propiedades específicas de la columna que se aplican a elementos Grid.
        ColumnDefinition  
      TextBlock   Proporciona un control ligero para mostrar pequeñas cantidades de contenido de flujo.
      TextBlock    

7. Representación y enlaces de ItemTemplate de ListBox desde XAML:

ItemTemplateXAML3

8. Código de Aplicación Maestro Detalles ADO.NET en WPF:

A continuación se comenta algunos aspectos claves del código fuente en Visual Basic 2010 necesario para dar marcha a la aplicación planteada:

ADONETWPFVB

9. Código Fuente:

  • DemoWpf4Adonet (Visual Basic 2010, WPF 4, ADO.NET, SQL Server Compact 4)

10. En Resumen:

La aplicación Demo Maestro Detalles ADO.NET en WPF 4 descrita en este artículo ofrece un acceso directo a determinada estrategia de desarrollo de aplicaciones de última generación relacionado con actuales tecnologías Microsoft como WPF 4, SQL Server Compact 4.0, ADO.NET, etc. Y así establecer una alternativa sólida para dar inicio y continuidad a soluciones más compleja de forma rápida y segura.

11. Enlaces de Interés:

agosto 9, 2011

SQL Server Compact 4.0 y ASP.NET 4.0

Hola, la presente de este articulo es para resaltar de forma rápida y sencilla el tema de SQL Server Compact 4.0 dentro del escenario de ASP.NET 4.0.

Índice:

  1. Requisitos.
  2. SQL server Compact 4.0.
  3. SQL Server Compact 4.0 con ASP.NET 4.0.
  4. Código Fuente.
  5. En Resumen.
  6. Enlaces de interés.

Requisitos:

  1. Visual Studio 2010 Service Pack 1 (SQL Server Compact 4.0)
  2. Visual Studio 2010 SP1 Tools for SQL Server Compact 4.0

SQL server Compact 4.0:

Es una base de datos compacta ideal para incrustarse en aplicaciones de escritorio y web. SQL Server Compact 4.0 proporciona a los desarrolladores un modelo de programación común a otras ediciones de SQL Server para el desarrollo tanto de aplicaciones nativas como administradas. SQL Server Compact ofrece funcionalidad de base de datos relacional en un espacio reducido: un sólido almacén de datos, un procesador de consultas de optimización y una conectividad confiable y escalable.

Características de SQL Server Compact 4.0:

  • Integración con WebMatrix y Visual Studio 2010 Service Pack 1
  • Compatibilidad por defecto con ASP.NET 4.0
  • Sencilla implementación privada
  • Integración con ADO.NET Entity Framework 4.0
  • Mayor Confiabilidad (capaz de tratar la carga de trabajo de los sitios web para principiantes)
  • Mayor Seguridad (uso de algoritmo SHA2)
  • Sintaxis de T-SQL para OFFSET y FETCH (Para realizar consulta de Paginación)
  • Mejoras de la API (System.Data.SqlServerCe.SqlCeConnection.GetSchema y System.Data.SqlServerCe.SqlCeConnectionStringBuilder)

SQL Server Compact 4.0 y ASP.NET 4.0:

SQL Server Compact 4.0 se ha optimizado y ajustado para usarse con aplicaciones Web ASP.NET. En él se garantiza que puede tratar la carga de los sitios Web para principiantes.

Características de SQL Server Compact 4.0 con ASP.NET 4.0:

  • Memoria Virtual optimizada para permitir un máximo de 256 conexiones por base de datos.
  • Uso de Confianza Parcial para ejecución dentro de escenario de aplicaciones ASP.NET
  • Mejor desempeño en escenario de conexiones simultáneas a la base de datos desde aplicaciones ASP.NET.
  • La marca SQLServerCompactEditionUnderWebHosting ya no se requiere en SQL Server Compact 4.0.

Pasos claves para trabajar con SQL Server Compact 4.0 y ASP.NET 4.0:

  1. Crear un sitio o aplicación del tipo ASP.NET 4.0 desde Visual Studio 2010.
  2. Dentro del proyecto y a nivel de la carpeta App_Data, se debe crear una o más Base de datos del tipo SQL Server Compact 4.0 (por ejemplo Database1.sdf)
  3. En dicha base de datos, se debe crear estructuras de datos (Tablas, Columnas, Clave Primaria, etc.) según sea el caso requerido.
  4. A nivel de propiedad de proyecto ASP.NET 4.0 en la parte de configuración debe crear uno o más valores del tipo de cadena de conexión que apunte correctamente a la base de datos ya mencionada.
  5. Verifique que la cadena de conexión generada dentro del Web.Config; tenga establecido su ProviderName =”System.Data.SqlServerCe.4.0
  6. Finalmente ya se puede comenzar a desarrollo con diferentes opciones de ASP.NET 4.0; por Ejemplo: ADO.NET, Control SqlDataSource, Control EntityDataSource, etc.

Código Fuente:

En Resumen:

Con la versión 4.0 de SQL Server Compact, ahora es posible trabajar de forma predeterminada con aplicaciones Web del tipo ASP.NET 4.0 en escenarios bien específicos sin necesidad de recurrir a la complejidad de otros motores de base de datos; para realizar gestiones de datos de menos impacto.

Enlaces de interés:

julio 23, 2011

Push Notifications en Windows Phone 7

Hola la presente de este articulo es para resaltar de manera rápida y sencilla el tema de Push Notification en Windows Phone 7 a través del lenguaje Visual Basic 2010.

Ruta del Articulo:

  1. Requisito.
  2. Introducción a Push Notification.
  3. Desarrollo con Microsoft Push Notification.
  4. Código de Ejemplo.
  5. Resumen.
  6. Link de Interés.

Requisito:

Introducción a Push Notification:

Es un servicio abierto en internet para el procesamiento y envió de mensaje en formato estándar a diferentes destinos móviles como son los teléfonos inteligentes; en los cuales se brindará notificaciones en tiempo real acerca de eventos ocurridos.

Desarrollo con Microsoft Push Notification:

Existe tres modalidades de trabajo con Microsoft Push Notification para Windows Phone 7:

  1. Notificaciones Toast: Es una notificación que se muestra en la parte superior de la pantalla para notificar al usuario de un evento, como una alerta de noticias o el tiempo. Los elementos de una Notificación Toast son: Titulo, Subtitulo y opcionalmente Parámetro.
  2. Notificaciones Tile: Es una notificación que puede ser usada para actualizar información breve sobre un icono mosaico situado en el inicio de Windows Phone 7. Los elementos de una Notificación Tile son: Contador, Imagen de Fondo, Titulo
  3. Notificaciones Raw: Esta notificación ideal para enviar información a su aplicación en ejecución directa con Windows Phone 7. Los elementos de una Notificación Raw puede ser uno o más elementos definido por el usuario.

Para iniciar el desarrollo con Microsoft Push Notification y Windows Phone 7 se necesita de lo siguiente:

  • Microsoft.Phone.Notification.HttpNotificationChannel: Crea un canal de notificación entre el servicio de notificación Push de Microsoft y el cliente  Push como Windows Phone 7. En este canal se establecerá una URI única por instancia de dispositivo con el cual se usará para recibir notificaciones de terceros.
  • System.Uri, System.Net.WebRequest y System.IO.Stream: Son elementos bien conocidos que pueden ser usados a través de un servicio o aplicación, para crear y enviar datos en formato estándar hacia determinado canal establecido entre el servicio de notificación Push de Microsoft y los clientes Windows Phone 7 suscripto.

Pasos claves para trabajar con Push Notification y Windows Phone 7:

En Windows Phone 7:

  1. A nivel del formulario se declara una variable con o sin eventos llamado por ejemplo “myHttpNotificationChannel” del tipo Microsoft.Phone.Notification.HttpNotificationChannel.
  2. Se procede a inicializar dicha variable en un objeto ya sea por una instancia nueva o recreando el objeto con una suscripción existente; todo esto desde un procedimiento el cual deberá ser llamado por el constructor del clase formulario.
  3. Se crea y vincula los diferentes procedimientos de eventos relacionado con el Objeto “myHttpNotificationChannel”, por ejemplo: ChannelUriUpdated, ErrorOccurred, HttpNotificationReceived, ShellToastNotificationReceived.
  4. Ahora en cada procedimiento de evento mencionado, se puede procede a escribir código de interés según sea el caso. Un ejemplo es el caso de ChannelUriUpdated: que se puede usar para informar asíncronamente a través de algún medio, el canal de notificación hacia terceros quienes desea que envié notificaciones.

En Servicio o Aplicación:

  1. Se define uno o más procedimiento de envió de información, por ejemplo: SendToast, SendTile, SendRaw en donde se arma el cuerpo del mensaje en XML para ser enviado por la red.
  2. Se define un procedimiento SendMessage, el cual se va encarga de enviar dicho mensaje a través de un canal de notificación con URI especifica advertido previamente por un cliente Windows Phone 7.

Código de Ejemplo:

Resumen:

Una vez más se encuentra una excelente alternativa de comunicación en tipo real con dispositivos inteligentes que contenga sistemas operativos como Windows Phone 7, para la notificación de datos de interés con usuarios de determinada organización.

Link de Interés:

abril 11, 2011

Autenticación y Autorización de ASP.NET

Archivado en: Seguridad — JorgePedraza @ 7:36 am
Tags: , , ,

Hola, la presente de este artículos es para resaltar de forma rápida y sencilla uno de los temas de seguridad en ASP.NET.

Dentro de la seguridad de ASP.NET se menciona el siguiente esquema fundamental:

  1. Autenticación
  2. Autorización

Autenticación: Es el mecanismo para validar las credenciales de usuario (Nombre y Clave) contra el acceso de un sitio web.

Descripción de la Autenticación:

Este mecanismo generalmente representa una interfaz de solicitud y validación de credenciales de usuarios, para aquellos usuarios que intenta ingresar a un sitio Web protegido.

Tipos de Autenticación:

Tipos

Descripción

Windows

Valida credenciales de usuarios contra las cuentas de usuarios de Microsoft Windows

Formulario

Valida credenciales de usuario contra cualquier repositorio de datos estándar.

Directorio Activo

Valida credenciales de usuario contra el Directorio activo de la red empresarial

Membership

Valida credenciales de usuario contra origen de datos especifico, por excelencia Microsoft SQL Server

Windows Identity Foundation

Valida credenciales de usuarios contra un servicio estandarizado de forma global en la Red.

Parámetros Básico de la Autenticación en ASP.NET (Web.config):

<system.web>

  <authentication mode="Forms">
    <forms loginUrl="login.aspx"></forms>
  </authentication>

  <authorization>
    <deny users="?">
  </authorization>

</system.web>

Ahora que conoce el mecanismo de Autenticación, se continua en el siguiente paso: El acceso autorizado a recursos con la Autorización en ASP.NET

Autorización: Es el mecanismo que establece permisos de acceso a recursos dentro del sitio Web para usuarios ya autenticados.

Descripción de la Autorización:

Este mecanismo toma como patrón base el sistema tradicional de Roles y Reglas de Acceso, donde cada Rol contiene un conjunto de reglas de acceso para usar dentro del sitio Web. Por ejemplo:

Roles

Reglas de Acceso

Administrador

Obtiene acceso a todos los recursos del sitio Web

Usuario

Obtiene acceso a cierto recursos del sitio Web

Invitado

Obtiene acceso a recursos básico del sitio Web

Parámetros Básicos de la Autorización en ASP.NET (Web.Config):

<system.web>

  <authorization>
    <allow roles="Finanzas, Administradores" />
    <allow users="Mario, Pedro" />
    <deny users=" * "/>
  </authorization>

</system.web>

Puntos claves para optimizar la Autenticación y Autorización de ASP.NET:

  • Validar la unicidad de las credenciales de usuarios contra el acceso de determinado sitio Web.
  • Evitar el uso de Query String para manipular información sensible de determinado usuario.
  • Proteger la entrada de datos contra XSS (Cross-Site-scripting).
  • Usar comandos parametrizado contra origen de datos.
  • Evitar el uso de Query dinámico a nivel de procedimientos almacenado.
  • Usar certificado digital SSL en ciertos módulos Web de extremada privacidad.

Código Fuente de Interés:

Links de Interés:

febrero 4, 2011

Debug y Trace

Archivado en: Aplicaciones Windows — JorgePedraza @ 7:38 pm
Tags: , , ,

Debug y Trace en .NET

Introducción

Las funciones de depuración integradas en Visual Studio 2010 son lo suficientemente potentes como para poder encontrar y subsanar la mayoría de los errores (de Sintaxis y lógicas) pero, en algunos casos, necesitará agregar instrucciones de seguimientos en su código que le permitirán comprender por qué la aplicación tiene comportamiento inadecuado. este sistema resulta especialmente útil cuando los problemas se producen únicamente en las aplicaciones compilidas que ya han sido previamente instalada en la maquina de destino. Por fortuna .NET Framework ofrece varias clases que simplifican esta tarea, como lo son las Clase Debug y Trace.

Requerimientos:

  • Framework 4.0
  • Microsoft Visual Studio 2010 (Plataforma de Desarrollo)
  • Microsoft Windows 7 o Superior

 Contenido:

Trace (Clase)

Debug (Clase)

Proporciona un conjunto de métodos y propiedades que le ayudan a realizar el seguimiento de la ejecución del código. No se puede heredar esta clase Proporciona un conjunto de métodos y propiedades que ayudan a depurar el código. No se puede heredar esta clase.
Ambas clases comparten métodos y Propiedades en comun:

Propiedades públicas

AutoFlush
Obtiene o establece si debe llamarse a Flush en Listeners después de cada escritura.
IndentLevel
Obtiene o establece el nivel de sangría.
IndentSize
Obtiene o establece el número de espacios de una sangría.
Listeners
Obtiene la colección de los agentes de escucha que está supervisando los resultados del seguimiento.

Métodos públicos

Assert
Sobrecargado. Comprueba una condición y muestra un mensaje si ésta es false .
Close
Vacía el búfer de resultados y, a continuación, cierra Listeners .
Fail
Sobrecargado. Emite un mensaje de error.
Flush
Vacía el búfer de resultados y hace que los datos almacenados en el búfer se escriban en Listeners .
Indent
Aumenta la propiedad IndentLevel actual en uno.
Unindent
Disminuye la propiedad IndentLevel actual en uno.
Write
Sobrecargado. Escribe información sobre el seguimiento en los agentes de escucha de seguimiento de la colección Listeners .
WriteIf
Sobrecargado. Escribe información acerca del seguimiento en los agentes de escucha de seguimiento de la colección Listeners si una condición es true .
WriteLine
Sobrecargado. Escribe información sobre el seguimiento en los agentes de escucha de seguimiento de la colección Listeners .
WriteLineIf
Sobrecargado. Escribe información acerca del seguimiento en los agentes de escucha de seguimiento de la colección Listeners si una condición es true .

Las clases Debug y Trace son idénticas y exponen los mismos métodos. La única diferencia que existe entre ellas es que las llamadas a los métodos de la clase Debug se incluirán en la aplicación compilada sólo si la constante de compilación Debug se encuentra definida, mientras que las llamadas a los métodos de la clase Trace sólo se incluye si la constante de compilación Trace se encuentra definida. De forma predeterminada, el tipo de configuración Debug define estas dos constantes de compilación, mientras que el tipo de configuración Realease define únicamente la constante Trace. De esta forma, la salida de la clase trace estará incluida en todas las aplicaciones compiladas en el modo Release.

Trace (Clase)

Debug (Clase)

Sub MiProc()

Trace.WriteLine("Escritura de MiProc")

Trace.Indent()

Trace.WriteLine("Dentro de MiProc")

Trace.Unindente()

Trace.WriteLine("Salir de MiProc")

End Sub

Sub MiProc()

Debug.WriteLine("Escritura de MiProc")

Debug.Indent()

Debug.WriteLine("Dentro de MiProc")

Debug.Unindente()

Debug.WriteLine("Salir de MiProc")

End Sub

 

switchs Proporciona una clase base abstracta (MustInherit en Visual Basic) para crear nuevos modificadores de depuración y seguimiento. Existen dos tipos de switchs predefinidos:

TraceSwitch (Clase)
BooleanSwitch (Clase)
Proporciona un modificador de varios niveles para controlar los resultados del seguimiento y la depuración sin volver a compilar el código. Proporciona un modificador de activación/desactivación sencillo que controla los resultados de la depuración y del seguimiento.

Cuando se establece el nivel de seguimiento con un archivo de configuración, se especifica un valor entero que se corresponda con un miembro de enumeración en lugar del miembro de enumeración en sí, tal y como se muestra en el siguiente ejemplo.

<configuration>
<system.diagnostics>
<switches>
<add name="mySwitch" value="4" />
</switches>
</system.diagnostics>
</configuration>

En la siguiente tabla se muestra la relación que existe entre los miembros de la enumeración TraceLevel y las entradas correspondientes del archivo de configuración.

Nivel de seguimiento Valor del archivo de configuración
Off 0
Error 1
Warning 2
Info 3
Verbose 4

Nombre de Miembros

Error
Envía mensajes de control de errores.
Info
Envía mensajes informativos, advertencias y mensajes de control de errores.
Off
No envía ningún mensaje seguimiento ni de depuración.
Verbose
Envía todos los mensajes de seguimiento y depuración.
Warning
Envía advertencias y mensajes de control de errores.

 

TraceSwitch (Clase)
BooleanSwitch (Clase)
Private Shared myTraceSwitch As New TraceSwitch("MySwitch", "Description")
myTraceSwitch.Level = TraceLevel.Info
Trace.WriteLineIf(myTraceSwitch.TraceError, "It displayed because it lower then info")
Dim dataSwitch As New BooleanSwitch("Data", "ModulodeNivel Establecido!")
If dataSwitch.Enabled Then
MsgBox("Si esta Habilitado el Nivel Data")
Else
MsgBox("No esta Habilitado el Nivel Data")
End If

 

Código Fuente :TestDebugTrace (Visual Basic 2010)

Conclusión: Estas clases son de gran utilidad al momento de hacer seguimiento en aquellas aplicaciones compilidas que ya han sido instaladas en el sitio de destino del cliente. Cuya finalidad es ayudar a Descubrir Posible comportamiento inesperado que no se habían presentado durante la fase de Desarrollo de la Aplicación.

Fuentes:

enero 29, 2011

Funcion Cifrado .NET

Archivado en: Seguridad — JorgePedraza @ 10:50 am
Tags: , , , ,

FUNCIÓN CIFRADO .NET

El Presente articulo explica como crear y utilizar una función genérica dentro de la Plataforma .NET para encriptar y desencriptar datos, en general cadena de caracteres; utilizando un algoritmo genérico que hace uso de los diferentes estándares de servicio de cifrado que proporciona el .NET Framework.

  • DES (Digital Encryption Standard)
  • Triple Des
  • Rijndael
  • RC2

Indice:

Requerimientos:

  • Sistema Operativo Windows XP o Superior
  • Sistema de Desarrollo Microsoft Visual Studio 2010

La Función descrita en este articulo, solo se requiere que tenga conocimiento de la herramienta de desarrollo Microsoft Visual Basic 2010

Introducción:

La criptografía impide la visión o modificación de los datos, y ofrece canales de comunicación seguros que de lo contrario resultarían inseguros. Por ejemplo, los datos pueden cifrarse usando un algoritmo criptográfico estandar, durante la transmisión de información en la red. Sí un tercero intercepta los datos cifrados, le resultará difícil descifrarlos.

Primitiva criptográfica
Uso
Cifrado de clave secreta (criptografía simétrica) Realiza la transformación de los datos, impidiendo que terceros los lean. Este tipo de cifrado utiliza una clave secreta compartida para cifrar y descifrar los datos.
Cifrado de clave pública (criptografía asimétrica) Realiza la transformación de los datos, impidiendo que terceros los lean. Este tipo de cifrado utiliza un par de claves pública y privada para cifrar y descifrar los datos.
Firmas criptográficas Garantiza que los datos se originen en una parte específica mediante la creación de una firma digital única para esa parte. En este proceso también se usan funciones hash.
Valores hash criptográficos Asigna datos de cualquier longitud a una secuencia de bytes de longitud fija. Los valores hash son únicos estadísticamente; el valor hash de una secuencia de dos bytes distinta no será el mismo.

Para el caso del algoritmo de nuestra Función Cifrado.NET, se utilizo la modalidad Cifrado de clave secreta (criptografía simétrica).

Los algoritmos de cifrado de clave secreta utilizan una clave secreta única para cifrar y descifrar datos. Debe asegurarse de que agentes no autorizados no obtengan acceso a la clave puesto que podrían utilizarla para descifrar los datos.

Normalmente, los algoritmos de clave secreta, denominados de cifrado de bloques, se utilizan para cifrar un bloque de datos a la vez. Los cifrados de bloques (como RC2, DES, TripleDES y Rijndael) transforman criptográficamente un bloque de entrada de n bytes en un bloque de salida de bytes cifrados. Si desea cifrar o descifrar una secuencia de bytes, debe hacerlo bloque a bloque. Como el tamaño de n es pequeño (n = 8 bytes para RC2, DES y TripleDES; n = 16, el valor predeterminado; n = 24; o n = 32 bytes para Rijndael), los valores mayores que n deben cifrarse en un bloque cada vez.

Las clases de cifrado de bloques que ofrece la biblioteca de clases base utilizan un modo de encadenamiento denominado CBC (Cipher Block Chaining, encadenamiento de bloques de cifrado), que utiliza una clave y un IV (Initialization Vector, vector de inicialización) para realizar transformaciones criptográficas en los datos.

.NET Framework proporciona las siguientes clases que implementan algoritmos de cifrado de clave secreta:

  • DESCryptoServiceProvider
  • RC2CryptoServiceProvider
  • RijndaelManaged
  • TripleDESCryptoServiceProvider

Objetivo General :

Para que el algoritmo funcione correctamente dentro de la Plataforma .NET; se necesita de lo siguiente: El uso de una Cadena de Caracteres de entrada de Datos, Key (Clave secreta) y IV (Initialization Vector), Cuya longitud debe variar de acuerdo con el servicio de cifrado que haya seleccionado dentro la función; por que de lo contrario se producirá una excepción.

Tabla de Longitudes de los Parametros

Clase
Soporte de Longitud Key (Clave Secreta)
Ejemplo

DES

8 Byte

  • Key = “Password”
  • IV = “Password”

Triple Des

16 o 24 Byte

  • Key = “password12345678″
  • IV = “password12345678″

Rijndael

16 Byte

  • Key = “1234567891234567″
  • IV = “1234567891234567″

RC2

16 Byte

  • Key = “1234567891234567″
  • IV = “1234567891234567″

Especificación del Algoritmo:

Para efecto de nuestro algoritmo; se debe utilizar las siguientes clase del Framework:

  • System.Security.Cryptography (El espacio de nombres System.Security.Cryptography proporciona servicios de cifrado, entre los que se incluyen la codificación y descodificación segura de los datos y otras muchas operaciones como, por ejemplo, la técnica de dispersión o hashing, la generación de números aleatorios y la autenticación de mensajes).
  • System.Text (El espacio de nombres System.Text contiene clases que representan codificaciones de caracteres ASCII, Unicode, UTF-7, y UTF-8; clases base abstractas para la conversión de bloques de caracteres en bloques de bytes y viceversa; y una clase auxiliar que manipula y da formato a objetos String sin necesidad de crear instancias intermedias de String).
  • System.IO (El espacio de nombres System.IO contiene tipos que permiten leer y escribir en los archivos y secuencias de datos, así como tipos que proporcionan compatibilidad básica con los archivos y directorios. )
Clase
Descripción
System.Security.Cryptography
  • ICryptoTransform: Define las operaciones básicas de las transformaciones criptográficas.
  • CryptoStream: Especifica el modo de una secuencia criptográfica
System.Text
  • Encoding:Representa una codificación de carácter.
System.IO
  • MemoryStream:Crea una secuencia cuyo almacén de respaldo es la memoria.

Demostración del Código:

Breve configuración de la función Cifrado:

  • Modo:
    • 1 es Encriptar;
    • 2 es Desencriptar
  • Algoritmo:
    • 1 es DES
    • 2 es TripleDES
    • 3 es RC2
    • 4 es Rijndael
  • Cadena: Es la Cadena de Caracter a Cifrar.
  • Key: Clave Secreta
  • VecI: Vector de Inicialización

Imports System.Security.Cryptography

Imports System.Text

imports System.IO

Module Module1

Public Function Cifrado(ByVal modo As Byte, ByVal Algoritmo As Byte, ByVal cadena As String, ByVal key As String, ByVal VecI As String) As String

Dim plaintext() As Byte

If modo = 1 Then

plaintext = Encoding.ASCII.GetBytes(cadena)

ElseIf modo = 2 Then

plaintext = Convert.FromBase64String(cadena)

End If

Dim keys() As Byte = Encoding.ASCII.GetBytes(key)

Dim memdata As New MemoryStream

Dim transforma As ICryptoTransform

Select Case Algoritmo

Case 1

Dim des As New DESCryptoServiceProvider ‘ DES

des.Mode = CipherMode.CBC

If modo = 1 Then

transforma = des.CreateEncryptor(keys, Encoding.ASCII.GetBytes(VecI))

ElseIf modo = 2 Then

transforma = des.CreateDecryptor(keys, Encoding.ASCII.GetBytes(VecI))

End If

Case 2

Dim des3 As New TripleDESCryptoServiceProvider ‘TripleDES

des3.Mode = CipherMode.CBC

If modo = 1 Then

transforma = des3.CreateEncryptor(keys, Encoding.ASCII.GetBytes(VecI))

ElseIf modo = 2 Then

transforma = des3.CreateDecryptor(keys, Encoding.ASCII.GetBytes(VecI))

End If

Case 3

Dim rc2 As New RC2CryptoServiceProvider ‘RC2

rc2.Mode = CipherMode.CBC

If modo = 1 Then

transforma = rc2.CreateEncryptor(keys, Encoding.ASCII.GetBytes(VecI))

ElseIf modo = 2 Then

transforma = rc2.CreateDecryptor(keys, Encoding.ASCII.GetBytes(VecI))

End If

Case 4

Dim rj As New RijndaelManaged ‘Rijndael

rj.Mode = CipherMode.CBC

If modo = 1 Then

transforma = rj.CreateEncryptor(keys, Encoding.ASCII.GetBytes(VecI))

ElseIf modo = 2 Then

transforma = rj.CreateDecryptor(keys, Encoding.ASCII.GetBytes(VecI))

End If

End Select

Dim encstream As New CryptoStream(memdata, transforma, CryptoStreamMode.Write)

encstream.Write(plaintext, 0, plaintext.Length)

encstream.FlushFinalBlock()

encstream.Close()

If modo = 1 Then

cadena = Convert.ToBase64String(memdata.ToArray)

ElseIf modo = 2 Then

cadena = Encoding.ASCII.GetString(memdata.ToArray)

End If

Return cadena ‘Aquí Devuelve los Datos Cifrados

End Function

End Module


screenshotCDCS

Cadena1 = Cifrado(1,1,”Usuario Demo”,”eeaataxz”,”eeaataxz”) –> Aquí se Encripta

Cadena2 = Cifrado(2,1,Cadena1,”eeaataxz”,eeaataxz”) –> Aquí se Desencripta

Cadena1 = “mR6A9ViW8f5BHtJgNEK78w==”

Cadena2 = “Usuario Demo”


Código Fuente: Cifrado-NET

Conclusión: Con esta función se pretende obtener una mayor ventaja de las herramientas que proporciona el .NET framework, de una forma rápida y segura para aquellos que desean cifrar información con tan solo invocar una instrucción previamente configurada.

Fuentes:

enero 2, 2011

Los números de 2010

Archivado en: Uncategorized — JorgePedraza @ 7:32 am

Los duendes de estadísticas de WordPress.com han analizado el desempeño de este blog en 2010 y te presentan un resumen de alto nivel de la salud de tu blog:

Healthy blog!

El Blog-Health-o-Meter™ indica: Wow.

Números crujientes

Imagen destacada

Alrededor de 3 millones de personas visitan el Taj Mahal cada año. Este blog fue visto cerca de 27,000 veces en 2010. Si el blog fuera el Taj Mahal, se necesitarían alrededor de 3 días para visitarlo.

En 2010, publicaste 13 entradas nueva, haciendo crecer el arquivo para 25 entradas. Subiste 244 imágenes, ocupando un total de 2mb. Eso son alrededor de 5 imágenes por semana.

Tu día más ocupado del año fue el 4 de febrero con 402 visitas. La entrada más popular de ese día fue Servicios Web.

¿De dónde vienen?

Los sitios de referencia más populares en 2010 fueran social.msdn.microsoft.com, facebook.com, mail.live.com, blogs.msdn.com y google.es.

Algunos visitantes buscan tu blog, sobre todo por aplicaciones windows mobile 6.5, windows mobile 6.5 aplicaciones, aplicaciones para windows mobile 6.5, plantillas y windows mobile 6.5 professional.

Lugares de interés en 2010

Estas son las entradas y páginas con más visitas en 2010.

1

Servicios Web enero, 2010
3 comentários

2

Windows Mobile 6.5 – Aplicaciones móviles de próxima generación julio, 2009
8 comentários

3

Convertir pagina HTML a ASP.NET julio, 2009
7 comentários

4

Exportar DataTable a Excel desde ASP.NET enero, 2010
4 comentários

5

Implementación de Aplicaciones Web con Visual Studio 2010 enero, 2010

Página siguiente »

Theme: Rubric. Blog de WordPress.com.

Seguir

Get every new post delivered to your Inbox.