viernes, 28 de agosto de 2009

Ya Soy Desarrollador Cinco Estrellas

Diploma Desarrollador 5 Estrellas

¿Qué es el programa Desarrollador Cinco Estrellas?

Es un programa de capacitación online gratuita en tecnologías .NET de Microsoft.

DCE tiene la virtud de iniciar en un nivel muy básico y llevarte hasta un nivel técnico bastante alto. Para ello cuenta con “La Biblioteca de las Estrellas”, donde encontraras los contenidos que podrás descargar y estudiar antes de presentarte a cada examen.

El plan de entrenamiento es el siguiente:

La principal razón por la cual estoy posteando sobre este programa en el día de hoy es porque acabo de conseguir mi quinta estrella.

viernes, 21 de agosto de 2009

Error: Could not load 'Microsoft.Web.Extensions'

Recientemente, un cliente a quien le había echo un sitio Web hace un tiempo atrás, decidió cambiar el sitio de servidor, por motivos que no vienen a caso ahora. En fin, que al realizar el cambio hacia el nuevo servidor, le comenzó aparecer el siguiente error:

“Could not load file or assembly 'Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies.”

El sitio lo había realizado usando:

  • ASP.NET 2.0
  • ASP.Net 2.0 AJAX Extensions

La causa y la solución son bastante simples.

Causa:

En el nuevo servidor no estaba instalado el ASP.Net 2.0 AJAX Extensions, que no son mas que un conjunto de extensiones que nos permiten utilizar la tecnología AJAX en los proyectos de ASP .Net 2.0.

Solución:

La solución no es otra que instalarnos el paquete de ASP.Net 2.0 AJAX Extensions, si quieres ver como hacerlo pincha aquí.

miércoles, 19 de agosto de 2009

ASP.NET 2.0 AJAX Extensions, Instalación

Instalando el paquete de ASP.Net 2.0 AJAX Extensions, paso a paso:

  1. Nos aseguraremos de estar logados en el ordenador con derechos de administrador.
  2. Descargaremos el fichero de instalación ASPAJAXExtSetup.msi desde la siguiente ubicación Microsoft ASP .Net 2.0 AJAX Extensions 1.0.
  3. Ejecutamos el archivo descargado (ASPAJAXExtSetup.msi).

Nos aparecerá la siguiente ventana:

ASP.NET 2.0 AJAX Extensions1

Y seguimos las indicaciones de la instalación.

ASP.NET 2.0 AJAX Extensions2

Fin de instalación de ASP.NET AJAX Extensions

Artículos Relacionados:

domingo, 16 de agosto de 2009

Windows CardSpace, Identidad Digital

Para comprender mejor la identidad digital lo mejor es hacer un símil con la vida real.

En nuestra vida cotidiana, la forma en que presentamos nuestra identidad cambia dependiendo de a quien nos identificamos. Cuando presentamos el pasaporte en un aeropuerto, somos un ciudadano de algún país. Cuando mostramos la licencia de conducir a un policía, soy un conductor legal que reside en alguna localidad. Cuando uso la tarjeta de crédito para pagar algo, soy un cliente con un número de cuenta en particular. Diferentes contextos requieren distintas identidades, cada una de las cuales es expresada de una manera diferente y contiene distinta información.

Igualmente, diferentes tipos de identidades digitales seguirán siendo necesarios (no bastará una simple identidad). Y tampoco bastará un simple proveedor de identidades. Esto significa que la solución es encontrar una manera coherente de usar múltiples sistemas de identidad digital. Lo que se requiere es un sistema de sistemas (un Meta sistema) concentrado en identidad.

Todas las identidades digitales tienen un punto en común: cuando es transmitida en la red, cada identidad digital es representada por algún tipo de token de seguridad. Un token de seguridad es sólo un conjunto de bytes que expresa información sobre una identidad digital. Esta información consiste en uno o más claims, cada uno de los cuales contiene una parte de la información convenida sobre esta identidad. Un token de seguridad simple puede incluir un solo claim que contenga el nombre de usuario, mientras que uno más complejo puede incluir claims que contengan el nombre del usuario, apellido, dirección y más. Los tokens de seguridad por alguna identidad digital también podrían incluir claims que contengan información sensible, como números de tarjetas de crédito.

 

El proceso de autenticación

El proceso comienza cuando un usuario del navegador accede a una página protegida en un sitio web (Ejemplo Hotmail). En este punto, el sitio requiere que el usuario se logue.

El formulario de login le puede permitir al usuario iniciar sesión en el sitio proporcionando su nombre de usuario y contraseña, pero si el sitio es compatible con CardSpace, la página que transporta el formulario también contendrá un OBJECT tag específico o una sintaxis XHTML.

CardSpace Iniciar con Tarjeta

Si el usuario selecciona esta opción (Tarjeta de Información o CardSpace), IE 7 o superior ejecutará un código identificado por el OBJECT tag o la sintaxis XHTML, que requerirá la implicación de CardSpace's en el proceso de login.

La pantalla de CardSpace aparecerá, y el usuario podrá seleccionar una identidad.

CardSpace Iniciar con Tarjeta

Además tendrá la posibilidad de agregar una nueva tarjeta si lo desea, o solamente seleccionar una tarjeta existente y presionar Enviar.

Hasta aquí, toda la comunicación con este sitio utilizó HTTP. Una vez que el usuario selecciona una identidad, sin embargo, CardSpace se contacta con el proveedor de la identidad usando WS-Trust, como es habitual, y obtiene el token de seguridad.

Este token luego es enviado al sitio web usando HTTP POST como parte del proceso de login. La aplicación web puede usar el token para autenticar al usuario o para cualquier otro propósito.

 

Características fundamentales de CardSpace

  • Soporte a cualquier sistema de identidad digital.
  CardSpace puede trabajar con cualquier sistema de identidades, usando cualquier tipo de token de seguridad, incluidos simples usernames, certificados X.509, tickets Kerberos, tokens SAML, o cualquier otro.
  • Control consistente de la identidad digital.
  • Reemplazo del password basado en Web Login.
  • Mejora en la confianza en la identidad de aplicaciones remotas.

Requisitos para usar CardSpace

  • Debemos usar IE7 o superior, aunque también hay una extensión para usar CardSpace en Firefox.
  • .NET Framework 3.0 o superior instalado.

Windows CardSpace, Tipos de Tarjetas

Windows CardSpace le ayuda a controlar su información personal. Puede decidir cuándo y con quién desea compartir esa información. Windows CardSpace admite dos tipos de tarjetas:

Tarjetas Personales:

Son creadas por los propios usuarios. La información personal que especifica en una tarjeta se almacena en el equipo. Para mantenerla segura, la información se cifra. La información almacenada incluye datos personales, como su nombre, direcciones, números de teléfono, fecha de nacimiento y sexo. Entre la información adicional de la tarjeta se incluyen datos como el nombre, la imagen y la fecha de creación de la tarjeta, así como un historial de los sitios en los que se ha usado esa tarjeta.

Tarjetas Administradas:

Son creadas por los proveedores de tarjetas administradas en nombre de los usuarios. La información personal que representa una tarjeta administrada es mantenida por el proveedor de tarjetas administradas que la emite. Dicho proveedor de tarjetas administradas almacena la información en su sitio. Parte de la información de la tarjeta administrada se almacena en el equipo. En esta información se incluye el nombre de la tarjeta, la fecha en que se instaló, la fecha de caducidad y un historial de los sitios en los que se usó esta tarjeta.

Al visitar un sitio web que acepta tarjetas de información, éste indica qué tipo de tarjetas puede aceptar. La experiencia como usuario de Windows CardSpace le indicará qué tarjetas de la colección cumplen los requisitos del sitio. Antes de enviar una tarjeta a un sitio, puede inspeccionarla para ver qué información personal se enviará. También es conveniente que examine la declaración de privacidad del sitio para conocer cómo utiliza la información personal de los usuarios.

Acá les dejo 2 link útiles:

 

Código de un ejemplo sencillo de CardSpace

En el ejemplo contaremos con 2 páginas, Sample1.html y Login1.aspx

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Sample 1</title>
</head>
<body>
    <form id="form1" method="post" action="login1.aspx">
    <div>
        <button type="submit">Click here to sign in with your Information Card</button>
        <object type="application/x-informationcard" name="xmlToken">
            <param name="tokenType" value="urn:oasis:names:tc:SAML:1.0:assertion" />
            <param name="requiredClaims" value="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier" />
        </object>
    </div>
    </form>
</body>
</html>
<%@ Page Language="C#"  Debug="true" ValidateRequest="false"%>
<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = Request.Params["xmlToken"];
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        The value of the token is:
        <asp:Label ID="Label1" runat="server" Text="Label">
        </asp:Label></div>
    </form>
</body>
</html>

domingo, 9 de agosto de 2009

jQuery Tools – Overlay, Mostrar un dialogo Cargando…

jQuery Tools Overlay jQuery Tools, es una moderna colección de componentes de interfaces de usuarios.

Hoy pretendo hablar de uno de los componentes de esta colección, me refiero al control Overlay.

jQuery Tools, Overlay

Pero como siempre veamos el componente a través de un ejemplo. Imaginemos que estamos desarrollando una pagina web en la cual después de captar una ciudad de origen,  destino y una fecha, buscaremos los vuelos disponibles.

Es de suponer que el proceso de búsqueda de vuelos, tarde un poco, y por ende seria interesante mostrar una ventana modal de cargando datos…, que además de no impacientar al usuario, también nos asegura que este no haga clic más de una vez en el botón de búsqueda.

El resultado seria algo así:

jQuery Tools Overlay Cargando

En el código de solución que está mas abajo veremos lo siguiente:

1. Lo primero será hacer referencia a la hoja de estilo css y a los js (jQuery y jQuery Tools)

2. Definir el componente Overlay.

3. Definir el botón que abrirá el dialogo y el contenido a mostrar.

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Página Ejemplo Overlay Cargando...</title>
    <link rel="stylesheet" type="text/css" href="http://static.flowplayer.org/tools/css/overlay-minimal.css"/> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript" src="http://cdn.jquerytools.org/1.0.2/jquery.tools.min.js"></script>
		
    <script type="text/javascript">
      $(document).ready(function(){
        $("#btnTest").overlay({ 
            expose: '#6096D4',
            closeOnClick: false,
            onLoad: function() { 
                window.location = 'ShowOverlayCargando.aspx?Time=5000';
            },
            onBeforeClose: function() { return false }            
        });
      });
    </script>
</head>
<body>
    <form id="form1" runat="server">
      <div>
        <asp:Button ID="btnTest" rel="#overlay" Text="Buscar Vuelos" runat="server" />            
        
        <div class="overlay" style="height:200px; width:450px;" id="overlay"> 
            <h2 style="margin:10px 0">Cargando Datos</h2>
            <p style="float: left; margin:0px 20px 0 0;"> 
                <img alt="" src="http://static.flowplayer.org/img/title/eye192.png" /> 
            </p> 
            <p> 
              Cargando los datos, por favor espere...
            </p> 
        </div>        
        
      </div>
    </form>
</body>
</html>

Debemos tener en cuenta que en el evento onLoad del componente Overlay, lo que hacemos es recargar la página pasándole como parámetro (en este ejemplo Time=5000, 5 segundos) en un caso real deberíamos pasarle las ciudades y fechas para la búsqueda de los vuelos.

En este punto solo nos queda el código del codebehind, que es donde deberíamos hacer la búsqueda de los vuelos, en nuestro caso solo haremos una espera de 5 segundos para simular la demora.

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        if (Request["Time"] != null)
            BuscarVuelos(Convert.ToInt32(Request["Time"].ToString()));
    }
}
private void BuscarVuelos(int timeOut)
{
    Thread.Sleep(timeOut);
}

Hasta aquí el ejemplo de uso de Overlay. Espero te halla servido para iniciarte en esta interesante biblioteca de componentes.

Si deseas conocer como resolver este mismo ejemplo pero utilizando JQuery UI – Dialog, entonces pincha aquí.

Artículos Relacionados:

 

sábado, 8 de agosto de 2009

jQuery UI – Dialog, Mostrar un Dialog Cargando…

jQuery UI Solo En un articulo anterior comenté sobre jQuery Tools, una moderna colección de componentes de interfaces de usuarios.

Hoy pretendo hablar de otra colección jQuery UI, y en particular del control Dialog. jQuery UI es una biblioteca de componentes para jQuery, con interesantísimos efectos visuales para la creación de aplicaciones web.

jQuery UI, Dialog

Pero como siempre veamos el componente a través de un ejemplo. Imaginemos que estamos desarrollando una pagina web en la cual después de captar una ciudad de origen,  destino y una fecha, buscaremos los vuelos disponibles.

Es de suponer que el proceso de búsqueda de vuelos, tarde un poco, y por ende seria interesante mostrar una ventana modal de cargando datos…, que además de no impacientar al usuario, también nos asegura que este no haga clic más de una vez en el botón de búsqueda.

En el código de solución que está mas abajo veremos lo siguiente:

1. Lo primero será hacer referencia a la hoja de estilo css y a los js (jQuery y jQuery UI)

2. Definir el componente Dialog.

3. Definir el botón que abrirá el dialogo y el contenido a mostrar.

4. Y por ultimo la función javascript asociada al botón.

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Página ShowDialog Cargando...</title>
    <link type="text/css" href="http://jquery-ui.googlecode.com/svn/tags/1.7/themes/redmond/jquery-ui.css" rel="stylesheet" />
    
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script>
		
    <style type="text/css">
	body{ font: 62.5% "Trebuchet MS", sans-serif; margin: 50px;}
    </style>	
			
    <%--Mostrar Dialogo con botones--%>
    <script type="text/javascript">
	$(document).ready(function(){
 	// Dialog Cargando Sin Botones		
	$('#dialogLoading').dialog({
	    autoOpen: false,
	    width: 300,
	    modal: true
	  });			
	});
     </script>
</head>
<body>
    <form id="form1" runat="server">
      <div>
        <asp:Button ID="btnTest" Text="Prueba" OnClientClick="return btnTest_Click()" OnClick="btnTest_Click" runat="server" />    
        <!--En el div colocamos el contenido a mostrar-->
	<div id="dialogLoading" title="Cargando Datos...">
           <p>Espere miestras se cargan los datos...</p>
	</div>
      </div>
    </form>
    <script type="text/javascript">
      function btnTest_Click()
      {        
        $('#dialogLoading').dialog('open');
        return true;
      }
    </script>
</body>
</html>

En este punto solo nos queda el código del codebihind, que es donde deberíamos hacer la búsqueda de los vuelos, en nuestro caso solo haremos una espera de 5 segundos para simular la demora.

protected void btnTest_Click(object sender, EventArgs e)
{
   Thread.Sleep(5000);
}

jQuery-UI-Dialog Cargando

Hasta aquí el ejemplo de uso de jQuery UI, Dialog. Espero te halla servido para iniciarte en esta interesante biblioteca de componentes.

Si deseas conocer como resolver este mismo ejemplo pero utilizando JQuery Tools – Overlay, entonces pincha aquí.

Artículos Relacionados:

domingo, 2 de agosto de 2009

LINQ to XML en 10 minutos

¿Qué es LINQ to XML?

LINQ to XML es una interfaz de programación XML en memoria habilitada para LINQ.

La capacidad de consulta de LINQ to XML es comparable en cuanto a funcionalidad (aunque no en sintaxis) a XPath y XQuery. La integración de LINQ en Visual C# 2008 proporciona una escritura más rápida, comprobación en tiempo de compilación y una compatibilidad mejorada con el depurador.

LINQ to XML tiene la capacidad de usar los resultados de la consulta como parámetros en constructores de objetos XElement y XAttribute, que habilita un método eficaz para crear árboles XML. Este método, denominado construcción funcional, permite que los desarrolladores transformen fácilmente árboles XML de una forma a otra.

Construcción Funcional, Crear Arboles XML

Una de las ventajas más significativas de la programación con LINQ to XML es la facilidad con que se pueden crear árboles XML. La construcción funcional es la capacidad de crear un árbol XML en una sola instrucción y resulta ser una forma eficaz de crear elementos. A continuación se muestra un ejemplo:

    XElement pasajeros =
        new XElement("Pasajeros",
            new XElement("Pasajero",
                new XAttribute("ID", "1"),
                new XElement("Nombre", "Luis"),
                new XElement("Apellidos", "García Varela")),
            new XElement("Pasajero",
                new XAttribute("ID", "2"),
                new XElement("Nombre", "María"),
                new XElement("Apellidos", "Arias Arjona"))
    );

Resultado:

<Pasajeros>
  <Pasajero ID="1">
    <Nombre>Luis</Nombre>
    <Apellidos>García Varela</Apellidos>
  </Pasajero>
  <Pasajero ID="2">
    <Nombre>María</Nombre>
    <Apellidos>Arias Arjona</Apellidos>
  </Pasajero>
</Pasajeros>

Veamos ahora otro ejemplo en el que usamos la misma característica  de “Construcción Funcional” pero en esta ocasión el XML a construir lo obtendremos a partir de la tabla de datos Pasajeros:

XElement pasajeros =
    new XElement("Pasajeros",
        from p in db.Pasajeros
        orderby p.IdPasajero
        select 
            new XElement("Pasajero",
              new XAttribute("ID", p.IdPasajero),
              new XElement("Nombre", p.Nombre),
              new XElement("Apellidos", p.Apellidos))
    );

Resultado: El XML de resultado será similar al del ejemplo anterior con la única diferencia que tendremos tantos nodos Pasajero como registros existan en la tabla de Pasajeros.

Características Fundamentales de la Construcción Funcional:

  1. El constructor XElement toma varios tipos de argumentos para el contenido. Por ejemplo, puede pasar otro objeto XElement, que se convierte en un elemento secundario. Puede pasar un objeto XAttribute, que se convierte en un atributo del elemento. O bien, puede pasar cualquier otro tipo de objeto, que se convierte en una cadena y en el contenido de texto del elemento.
  2. El constructor XElement toma una matriz de params del tipo Object, de forma que puede pasar cualquier número de objetos al constructor. Esto permite crear un elemento que tiene un contenido complejo.
  3. Si un objeto implementa IEnumerable(T) , se enumera la recopilación del objeto y se agregan todos los elementos de la recopilación. Si la recopilación contiene objetos XElement o XAttribute, cada elemento de la recopilación se agrega por separado. Esto es importante porque permite pasar los resultados de una consulta de LINQ al constructor.

Consultar Arboles XML

Escribir consultas será la manera más eficaz de extraer datos de un árbol XML. Además, podemos usar la consulta, combinada con la construcción funcional, para generar nuevos documentos XML diferentes del original.

XElement pasajeros = XElement.Load(@"d:\tmp\LinqToXML_Pasajeros.xml");
IEnumerable<XElement> PasajeroSelect =
    from p in pasajeros.Elements("Pasajero")
    where (string)p.Element("Nombre") == "Luis"
    select p;
foreach (XElement p in PasajeroSelect)
    Console.WriteLine((string)p.Attribute("ID") + " - " + (string)p.Element("Nombre"));

Resultado:  1 – Luis

Veamos otra forma utilizando ahora tipos anónimos y XDocument.

XDocument xDocPasajeros = XDocument.Load(@"d:\tmp\LinqToXML_Pasajeros.xml");
var PasajeroSelect =
    from p in xDocPasajeros.Descendants("Pasajero")
    where (int)p.Attribute("ID") == 1
    select new { NombreCompleto =
        (string)p.Element("Nombre") + " " +
        (string)p.Element("Apellidos")};
foreach (var p in PasajeroSelect)
    Console.WriteLine("Nombre y  Apellidos: {0}.", p.NombreCompleto);

Resultado:  Nombre y  Apellidos: Luis García Varela.

Bueno hasta aquí este vistazo generar sobre LINQ to XML, en este post solo hemos rozado la pintura de este tema, es mucho más que lo visto, pero planteamos las ideas más generales y más usadas en la practica diaria, espero te halla servido para llevarte una idea generar sobre el tema. En próximos días continuaré profundizando un poco más sobre este apasionante tema.

Artículos Relacionados:

sábado, 1 de agosto de 2009

Bajar varios Javascript más rápidamente

En días pasado escribí sobre un curioso error que me ocurrió al intentar publicar un sitio web en el servidor de producción, el error era el siguiente:

El tipo 'System.Web.UI.ScriptManager' no tiene ninguna propiedad pública cuyo nombre sea 'CompositeScript'.

Si deseas ver la causa y la solución del error pincha aquí.

Pero bien volvamos al tema que nos ocupa, te preguntaras porque hablo de este otro articulo, pues bien, en aquel post anterior apenas comenté sobre esta nueva característica del Framework .Net 3.5 (Combinación de Script).

Soporte para la combinación de Script

.NET 3.5 SP1 introduce el nuevo elemento CompositeScript del control ScriptManager, que nos permite definir múltiples referencias de scripts. Todas las referencias del elemento CompositeScript se combinan en el servidor y son servidas como un script simple al cliente, reduciendo el número de peticiones al servidor y mejorando el tiempo de carga de las aplicaciones ASP.NET AJAX.

Cuando el navegador Web comienza a servir una página, nunca realiza mas de 4 peticiones simultaneas, por esta razón, cuantas más peticiones, más lento es el proceso de carga de una página. De aquí se desprende que en ocasiones es preferible tener menos peticiones y archivos más grandes.

Pero bien, veamos como hacerlo:

<html >
<head runat="server">
    <title>Scripts Combinados</title>
</head>
<body>
  <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    <CompositeScript>
      <Scripts>
        <asp:ScriptReference Path="~/Scripts/Script1.js" />
        <asp:ScriptReference Path="~/Scripts/Script2.js" />
        <asp:ScriptReference Path="~/Scripts/Script3.js" />
      </Scripts>
    </CompositeScript>
    </asp:ScriptManager>
  </form>
</body>
</html>