Welcome to Comunidad .NET de Cd. Juárez Sign in | Join | Help

Browse by Tags

All Tags » asp.net

Videos en español de Visual Studio 2008 y más por Channel 9

Para los que no lo conocen, Channel 9 es un sitio de Microsoft para desarrolladores donde puedes encontrar un montonal de videos—y más importante creo—opinar sobre muchas de las tecnologías que maneja la compañía. 

La mayoría de los videos están en inglés, pero hoy descubrí que si juegas con los tags puedes obtener un listado de los videos que está en español.  Este enlace te da dicho listado:

http://channel9.msdn.com/tags/Spanish/

Ahí encontrarás videos sobre Visual Studio 2008, Expression Web, incluso uno que otro sobre Silverlight y Expression Blend.

Por ejemplo, parece que acaban de sacar una serie de cinco partes sobre Expression Web—uno de los productos de la familia Expression diseñados para hacer desde sitios HTML hasta sitios con páginas ASP.NET.

Enjoy smile_shades

Cómo acceder a controles dentro de un GridView

Esta entrada salió como resultado de una pregunta que hicieron en el Foro de la Comunidad .NET.  La pregunta, esencialmente, es: ¿Cómo accedo a un control que tengo en una columna templeteada dentro de un GridView de ASP.NET?

Me pareció buena la pregunta, así que hice un pequeño ejemplo para ilustrarlo.   Una columna templeteada (TemplateField) es distinta a una normal (BoundField) en que tienes más control sobre los controles que aparecen en la columna.  En otras palabras, tú especificas qué quieres que se muestre cuando el renglón está en modo "normal" (ItemTemplate) o cuando está en modo "edición" (EditItemTemplate).  Puedes tener múltiples controles dentro de la columna, en lugar de solo uno que represente el dato.

La siguiente página contiene un GridView con tres columnas que vienen de un SqlDataSource.  Los datos provienen de la clásica base de datos Northwind.   En este caso estoy recuperando datos de la tabla de productos:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb"
  Inherits="_Default" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
  <title>Accediendo a Elementos en un GridView</title>
  <style type="text/css">
    #miGrid
    {
      width: 450px;
      float: left;
    }
  </style>
</head>
<body>
  <form id="form1" runat="server">
  <asp:Button runat="server" ID="leerElementosButton" Text="Leer elementos" />
  <div id="miGrid">
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
      DataKeyNames="ProductID" DataSourceID="SqlDataSource1" 
      EmptyDataText="No hay registros que mostrar.">
      <Columns>
        <asp:BoundField DataField="ProductID" HeaderText="ID Producto" 
          InsertVisible="False" ReadOnly="True" />
        <asp:BoundField DataField="ProductName" HeaderText="Nombre Producto" />
        <asp:TemplateField HeaderText="Descontinuado">
          <EditItemTemplate>
            <asp:CheckBox ID="CheckBox1" runat="server" 
              Checked='<%# Bind("Discontinued") %>' />
          </EditItemTemplate>
          <ItemTemplate>
            <asp:CheckBox ID="CheckBox1" runat="server" 
              Checked='<%# Bind("Discontinued") %>' Enabled="false" />
          </ItemTemplate>
        </asp:TemplateField>
      </Columns>
    </asp:GridView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
      ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
      ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>"
      SelectCommand="SELECT [ProductID], [ProductName], [Discontinued] FROM [Products]">
    </asp:SqlDataSource>
  </div>
  <div id="resultados">
    <asp:Label runat="server" ID="resultadosLabel" />
  </div>
  </form>
</body>
</html>

Para acceder, por ejemplo, al CheckBox que está dentro de la columna templeteada, primero necesitas una referencia al renglón, ya que el ID del control se repetirá n veces (una por cada renglón del Grid). 

Esto se puede hacer de varias formas, por ejemplo, si tienes un manejador para un evento clic en alguno de los controles dentro del renglón pues en ese caso el sender viene siendo el renglón en sí, entonces únicamente te falta encontrar el CheckBox de ese renglón para leer sus propiedades.   Otra forma de hacerlo, como en el siguiente ejemplo, es leer todos los renglones y por cada uno encontrar el CheckBox que le corresponde al renglón:

Partial Class _Default
  Inherits System.Web.UI.Page
 
  Protected Sub leerElementosButton_Click(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles leerElementosButton.Click
 
    Dim grid As GridView = Me.GridView1
    Dim checkBox As CheckBox
    Dim resultado As New StringBuilder
 
    For Each renglon As GridViewRow In grid.Rows
      checkBox = CType(renglon.FindControl("CheckBox1"), CheckBox)
      If checkBox.Checked Then  'Hacer algo con esta información
        resultado.Append(String.Format( _
          "El renglón {0} está descontinuado <br />", renglon.DataItemIndex))
      End If
    Next
 
    resultadosLabel.Text = resultado.ToString()
 
  End Sub
End Class

En resúmen, la idea clave aquí es que el GridView tiene una colección de renglones (de tipo GridViewRow) y cada uno de estos renglones tiene su correspondiente colección de controles que están dentro de ese renglón.  El GridViewRow también te da acceso al DataItem que contiene los datos asociados al renglón, en caso de que lo requirieras.

El resultado de correr el código anterior (dando clic al botón) es el siguiente:

Espero les ayude.

Enjoy smile_shades

Posted from Diario de un Dotnetero | 0 Comments
Filed under: ,

¿Dónde quedó el usuario ASPNET en Windows Vista? ¿Y qué $#!N&@2 es eso de los Application Pools?

Hoy aprendí algunas cosas más al continuar con mis aventuras de desarrollo ASP.NET en Windows Vista.  Muchas de estas cosas aparentemente no son nuevas, vienen desde IIS 6 que era la versión incluida con Windows Server 2003, pero yo nunca los usé, así que hasta ahora me vengo enterando.

La primer lección salió cuando andaba buscando el usuario ASPNET de mi máquina para asignarle permisos de escritura sobre un directorio donde mi aplicación permite que los usuarios suban archivos.  Después de un rato de jugar Where's Waldo con el usuario, me convencí que simplemente no existía.  Resulta que el ASP.NET Worker Process—el proceso bajo el cual se ejecuta el código de ASP.NET—corre ahora por default bajo la cuenta NETWORK SERVICE (aunque esto se puede cambiar fácilmente).  Ah, y por cierto, el Worker Process ahora se llama w3wp.exe, en lugar de aspnet_wp.exe.

La segunda lección vino cuando quise correr mi aplicación.  Resulta que si usas módulos HTTP (<httpModules>) en tu web.config, recibirás un mensaje de error porque IIS 7 intenta correr las aplicaciones por default en un Application Pool llamado—duh—DefaultAppPool, y éste tiene un Managed Pipeline Mode puesto a Integrated.

¿Güat?  A ver si me puedo explicar.  Si abres la consola administrativa de IIS y te vas a Application Pools, verás algo como esto:

De cajón, Vista traía los dos primeros—Classic .NET AppPool y DefaultAppPool.  El tercero fue creado cuando instalé SQL Server Reporting Services, así que por ahora ignóralo.

Lo primero que me pregunté fue ¿qué $#!N&@2 demonios es eso de los Application Pools?

Resulta que es una manera muy padre de segregar y asignar una aplicación Web—o más correctamente su Application Domain—a un Worker Process determinado.  Un Pool puede tener varios AppDomains, y estos estarán separados de los que corran en otros pools. Considera este ejemplo:

 

Aquí tenemos tres aplicaciones de ASP.NET, cada una con su directorio virtual.  Las primeras dos están asignadas al primer Application Pool, y la tercera aplicación está asignada al segundo.  Esto es EXCELENTE por varias razones:

¿Que pasaba antes si una falla en una de las aplicaciones web hacía que se reciclara el Worker Process?  Pues todas las aplicaciones se "reiniciaban"—botando posiblemente a las sesiones y todo el show—porque los Application Domains están corriendo en el mismo proceso ejecutable. Me ha pasado. Teníamos una applicación Web corriendo en el mismo servidor que un servicio Web (en una máquina con Windows 2000 si mal no recuerdo), y de vez en cuando la aplicación hacía que se reciclara el Worker Process—maldito Crystal Reports—llevándose entre las patas al Web Service.  Ahora es posible asilar ese tipo de fallas.

¿O qué pasaría si quiero correr una aplicación de ASP.NET v1.x en el mismo servidor que una de ASP.NET v2.x?  Un Worker Process solo puede correr una versión del .NET Framework, hasta donde sé, así que con Application Pools ahora puedes lograrlo.

Y más relevante para el problema que yo tenía, IIS 7 tiene una manera distinta de manejar los httpModules—llamado Managed Pipeline Mode. DefaultAppPool usa Integrated. Así que lo que tenía que hacer en mi caso era asignar el directorio virtual de mi aplicación al Classic .NET AppPool que utiliza el modo Classic, para no tener que cambiar la configuración (y posiblemente código) de mi aplicación.

Si inspeccionas las opciones avanzadas de un Application Pool te das cuenta que puedes configurar cosas interesantes. 

Las que me llamaron la atención fueron:

  • .NET Framework Version. Para seleccionar qué versión quieres utilizar para las aplicaciones Web que corren en el Pool, o si no quieres permitir que corra código administrado (p.ej. una aplicación de ASP clásico o PHP que no tenga nada que ver con .NET).
  • Managed Pipeline ModeIntegrated utiliza el modo IIS 7, donde la configuración de los httpModules están centralizados y supuestamente tiene varios beneficios que aún no conozco; Classic permite que cada aplicación web mantenga su configuración.
  • Identity.  La cuenta de usuario y bajo el cual corre el Worker Process. Esto afecta directamente los permisos de seguridad de las aplicaciones en el Pool.  Los valores posibles son: NetworkService, LocalService, LocalSystem, SpecificUser; este último por si quieres especificar una cuenta creada por ti.
  • Identity Specific User Credentials.  Para poner las "credenciales" (el password pues) del usuario si usas Identity=SpecificUser.
  • CPU Limit, Limit Interval y Limit Action.  Sirven para limitar el porcentaje de CPU que consume el Worker Process en un tiempo determinado y hacer algo si se excede, como por ejemplo, matarlo.
  • Private Memory Limit y Virtual Memory Limit.  Sirven para limitar la memoria real y virtual que utiliza el Worker Process. ¿Alguna vez le has pegado a un System.OutOfMemoryException? Yo si, y no es divertido.

Una vez que comencé a entender este rollo, asignar mi aplicación al Pool correcto fue súper sencillo.  Simplemente te vas a las opciones avanzadas de tu directorio virtual y lo cambias.

 

Enjoy smile_shades

Cómo configurar IIS 7 en Windows Vista para desarrollar con Visual Studio 2005 y SQL Server 2005

Aunque Windows Vista ya tiene más del año que salió, apenas hasta estos días pude migrar mi máquina primaria de trabajo a este sistema operativo—solo digamos que la empresa para la que chambeo es muuuuuuy cautelosa con este tipo de cambios.  Y aunque también ya salió Visual Studio 2008, aún tengo que utilizar la versión 2005.

Desarrollo principalmente aplicaciones ASP.NET y también necesito tener SQL Server 2005 Developer instalado localmente para correr tanto la base de datos como Reporting Services. 

Pero al intentar instalar estas herramientas me topé inmediatamente con los cambios en la manera que instalas IIS en Windows Vista.  Ya me habían platicado que IIS 7 era más modular, pero no me habían dicho qué tanto.  Por default, IIS ni siquiera viene habilitado, así que lo primero que tienes que hacer es instalarlo. 

Es sencillo, te vas a Control Panel > Programs > Turn Windows features on or off.

De las opciones que aparecen, palomea (osea dale clic en el checkbox) a lo siguiente, en este orden:

  1. Internet Information Services.  Esto selecciona automáticamente lo necesario para correr IIS.
  2. IIS > WWW Services > Application Development Features > ASP.NET.  Esto selecciona automáticamente lo necesario para correr aplicaciones de ASP.NET.
  3. IIS > Web Management Tools > IIS 6 Management Compatibility > IIS Metabase and IIS 6 configuration compatibility.  Este componente es necesario para Visual Studio 2005.
  4. Ya que andas por ahí, selecciona IIS 6 WMI Compatibility.  Este lo necesita SQL Server 2005.
  5. IIS > WWW Services > Common Http Features > HTTP Redirection.  Este también lo necesita SQL Server.

Da clic en OK, y se instalarán los componentes seleccionados.

Como puedes ver, solo necesitas 1, 2 y 3 para desarrollar ASP.NET con Visual Studio 2005.  Y si necesitas SQL Server 2005, agregas las opciones 3, y 4.

Si intentas instalar SQL Server sin lo anterior, es muy probable que recibas una advertencia como la siguiente:

Enjoy smile_shades

Dynamic Data se ve interesante (y con screencast se entiende mejor)

Dynamic Data es uno de los features de las ASP.NET 3.5 Extensions (aún en Preview) que me llamó la atención el otro día.  Te permite hacer una versión scaffolded—un armazón pues—de tu aplicación a partir de tu modelo de base de datos, algo al estilo de Rails.

(Ahí les encargo la traducción de “scaffolded” al español.  Hasta donde sé un scaffold es un andamio, como el que usan los maistros albañiles en la talacha, pero no creo que “andamiada” sea una palabra correcta. Y si lo es, qué fea.  A mi no me gusta nada “miado” o “miada”) smile_wink

Esto es bastante útil porque muchas veces necesitas arrancar con algo para poder meter datos aunque sea de prueba a tu base de datos.  Y muchas veces esto, con cambios muy menores, es suficiente para lo que los usuarios necesitan de la aplicación.  Si tienes una base de datos bien armada—y sí la tienes ¿verdad?—o al menos tu modelo de datos bien armado, esto ya te quitó esa talacha.

Ayer precisamente estaba intentando explicarle a un compañero del trabajo qué era Dynamic Data: “Pos ¿ya ves cómo está shida que puedes nomás arrastrar un SqlDataSource y un GridView a una página ASP.NET y sin mucho esfuerzo ya puedes editar tu tabla?  Bueno pues esto es como eso, pero para toda tu base de datos, si así lo quisieras. Y como está basado en templetes, pues puedes alterar de un sablazo todo el sitio...”

Pero al parecer no supe explicarlo muy bien, así que después de la cara de guatdefuc que me puso, me dió mucho gusto mostrarle este screencast (en inglés) que me encontré hoy en el blog de David Ebbo:

I made a screencast which walks through a basic scenario of using ASP.NET Dynamic Data in a simple site using Northwind.  It's about 17 minutes long.  Enjoy and feel free to give any feedback here or in the forum.

Enjoy. smile_shades

Cómo subir un archivo a tu servidor web mediante el control FileUpload de ASP.NET

Este es un tip súper sencillo, pero bastante útil, y como ya van varias personas que me lo preguntan, mejor lo explico aquí.

A menudo se ofrece que los usuarios de nuestra aplicación web nos envíen (o "suban") algún archivo al servidor web donde corre nuestra aplicación ASP.NET. Pudiera ser que el gerentoide tiene un archivo de texto o .CSV que necesitamos leer para cargarlo en la base de datos, o una imágen que vamos a poner como avatar en el perfil del usuario, qué se yo.

Con ASP.NET 2.0 o posterior, subir un archivo a tu servidor es sencillísimo mediante el control FileUpload. Supongamos que tenemos una forma de ASP.NET como esta:

Una forma ASP.NET para subir un archivo a tu servidor web

El markup sería el siguiente:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Subir un archivo</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h3>
Cómo subir un archivo a tu servidor web mediante ASP.NET
</h3>
<p>
Elige el archivo a subir:
<asp:FileUpload ID="trepador" runat="server" />
</p>
<p>
<asp:Button ID="subir" runat="server"
Text="Subir Archivo" OnClick="subir_Click" />
</p>
<p>
<asp:Label ID="estatus" runat="server"
Style="color: #0000FF"></asp:Label>
</p>
</div>
</form>
</body>
</html>


Como puedes ver la forma en realidad consiste de únicamente de un control FileUpload, un botón para iniciar el postback, y un Label que usaré para mostrar un mensaje. Al botón le asociamos un manejador para el evento Click—que veremos un poquito más abajo.

Las propiedades y métodos relevantes del control FileUpload son:

  • SaveAs(), que se usa para decir dónde quieres guardar el archivo que se está subiendo. Debes proporcionar la ruta completa y el nombre.
  • HasFile, que indica si el usuario ya escribió el nombre de un archivo o lo seleccionó mediante el botón "Browse..."

Ahora, este es el código para manejar el evento:

using System;
using System.IO;

public partial class _Default : System.Web.UI.Page
{
protected void subir_Click(object sender, EventArgs e)
{
if (trepador.HasFile)
{
string directorio = @"C:\Archivos de Usuario\";
if (Directory.Exists(directorio))
{
string archivo = directorio + trepador.FileName;
if(File.Exists(archivo))
{
// ya existe un archivo con el mismo nombre en el directorio
// hacer algo al respecto (p.ej. renombrar el que está en el
// servidor o asignarle otro nombre al que se está subiendo),
// de lo contrario el archivo en el servidor será sobre escrito
}
else
{
trepador.SaveAs(archivo);
estatus.Text = "
Tu archivo ha sido enviado exitosamente.";
//
// TODO: código para procesar el archivo va aquí...
//
}
}
else
{
throw new DirectoryNotFoundException(
"
El directorio en el servidor donde se suben los archivos no existe");
}
}
}
}



Consideraciones adicionales

Hay dos aspectos más que debes cuidar con esto de la "trepada" de archivos.

Primero, debes asegurarte que la cuenta de usuario bajo la que corre el ASP.NET Worker Process (típicamente la cuenta se llama ASPNET) tenga suficientes permisos de seguridad sobre el directorio donde quieres escribir los archivos en el servidor, de lo contrario verás una excepción de seguridad. Creo que el permiso mínimo que necesita es de Create, aunque yo casi siempre uso el de Modify.

Y segundo, ASP.NET, por default, está configurado para subir archivos de hasta 4 Mb únicamente (4096 bytes). Esto es porque la petición la recibe IIS primero y debe "tragársela" completa antes de pasársela al Worker Process. Si lo que vas a subir son archivos de texto, pues 4 Mb es un chorro, pero si es otro tipo de archivos—imágenes p0rno, archivos de Word, etcétera—pues esto podría ser terriblemente insuficiente. Si el archivo es muy grande, el otro problema es que la petición de HTTP pudiera exceder el tiempo máximo por petición y hacer timeout. Afortunadamente podemos alterar esto mediante el archivo de configuración del sitio (web.config):


<?xml version="1.0"?>
<configuration>
<system.web>
<!-- requerido para subir archivos grandes en este caso
especificas un tiempo máximo de 10 minutos (600 segundos)
y un tamaño máximo de archivos de 50Mb
-->
<httpRuntime executionTimeout="600" maxRequestLength="51200"/>
</system.web>
</configuration>


En la configuración anterior exageré un bastante, y deberías tener cuidado de valores como estos, ya que estás indicando que puede haber peticiones de ASP.NET que duren hasta 10 minutos ejecutándose, y esto podría llevar a que tu servidor se sature si de pronto hay varias peticiones grandes. Para la mayoría de las aplicaciones el valor default de 110 segundos (minuto y medio) como executionTimeout es suficiente. Especificar valores grandes para el maxRequestLength, de manera similar, expone tu servidor a ser saturado, así que debes alterar estos valores solo si en verdad lo requieres, y solo para los valores máximos que se necesiten para tu aplicación.

Por último, la documentación de ASP.NET dice que se debe especificar el valor de executionTimeout debe especificarse como un TimeSpan (p.ej. "00:01:50"), pero en la práctica, no he podido utilizarlo así. Siempre he tenido que especificarlo como el número de segundos.

Conclusión


El control FileUpload hace que el problema de subir achivos a tu servidor web sea pan comido. Solo necesitas agregarlo a tu página ASPX y agregar un botón u algún otro control para que invoque la lógica necesaria para copiar el archivo a tu servidor mediante el método SaveAs(). Solo debes cuidar que la cuenta ASPNET tenga los permisos adecuados, y que la configuración del servidor sea apropiada para los tipos de archivos que vayas a subir.Hay muchas mejoras que se le puede hacer al ejemplo de este artículo.

La primera que se me ocurre a mi es proporcionar algún tipo de retroalimentación al usuario de que el archivo se está procesando, o deshabilitar el botón inmediatamente después del click para que el usuario no le de click dos veces hasta que termine de subirse el archivo—estos son problemas bastante comunes cuando quieres subir archivos grandes y ya sea que tu servidor esté algo ocupado o tu usuario sea un neurótico desesperado que no puede esperar ni los 7 segundos promedio como el resto de los seres humanos normales... smile_baringteeth smile_wink pero en fin, esa ya es harina de otro costal, y tendría que hablar de ASP.NET AJAX. Quizá en la próxima.

Enjoy. smile_shades

Ya están disponibles las presentaciones y archivos de ASP.NET

Ya tenía un buen sin poder escribir por andar con las carreras del trabajo, pero de alguna forma tuve tiempo de dar el tema y el taller del mes de Septiembre y de Octubre de la Comunidad, donde el tema fue, primero ASP.NET "para novatos", y luego ASP.NET "intermedio".

El primer tema surgió, porque había muchas personas interesadas en comenzar a aprender ASP.NET pero que solo necesitaban una orientada de por dónde empezar.  Así que ese fue el espíritu de la reunión.  Vimos los conceptos fundamentales, basicotes pero necesarios para que entendieran qué estaba sucediendo.  Vimos algunos de los controles básicos, manejo de eventos, y hasta algo de DataBinding con controles como el GridView y DetailsView para hacer una página maestro/detalle.  Para la presentación tomé prestadas algunas de las diapositivas del material que viene en el Desarrollador Cinco Estrellas (que la verdad está excelente), pero le agregué algunas otras ilustraciones que a mi me ayudaron mucho.  Eventualmente, si Diosito me da licencia lo convertiré en uno o dos artículos para este blog porque el rollo que mareador que yo tiro no sale en los archivos jejeje.

 

Como la gente se quedó "picada", votaron por un tema "intermedio".  Así que en la siguiente reunión les platiqué acerca de controles de usuario (user controls), que son controles compuestos a partir de otros controles, de Master Pages, que es una manera de aplicar elementos comunes a todo tu sitio y también sobre todo el armazón de seguridad que agregaron con ASP.NET 2.0.  Escogí esos temas porque creo que son de los más útiles y prácticos en la chamba del día a día.  En el taller vimos con detalle y calma cómo instalar la base de datos de membresía, cómo aplicar seguridad a diferentes áreas del sitio y cómo utilizar todos los controles de membresía y navegación que vienen con Visual Studio.

En fin, me divertí bastante.  Si no pudiste asistir, aún puedes descargar las presentaciones y las soluciones de los talleres desde área de descargas del sitio de la Comunidad.

Enjoy.

Que NO hacer al mostrar errores en un sitio de ASP.NET público

Ayer que me disponía a ir al cine a pesar de ser miércoles 2x1 (o "miércoles de pelusa" como dice un amigo), pues lancé mi navegador para intentar revisar la cartelera en el sitio de una de las cadenas de salas de cine nacionales (no les digo cual pa' no quemarlos).

Me recibió el siguiente mensaje. Como dicen los gringos: what's wrong with this picture?



Pues para comenzar se me ocurre:
  1. No están manejando las excepciones adecuadamente. Aunque un error levantado por el HttpRuntime es un poco más difícil de atrapar, hay maneras de regresar páginas de error personalizadas que estén más bonitas y no asusten a los usuarios con las letrotas grandes y rojas.
  2. Están mostrando la información de debug con todo y el stack trace (!). Esto podría darles las herramientas o al menos información a alguien que quisiera hackearlos. Por ejemplo, con ese mensaje ya sé al menos qué versión del .NET Framework están utilizando, lo cual podría servirme para ver qué vulnerabilidades específicas pudiera explotar. Pero algunos otros mensajes de error son mucho más chismosos.
  3. "Server Too Busy" en mi mente se traduce a "somos bien codos y no compramos un web farm" o "no le invertimos en planear la capacidad necesaria" o "nuestra aplicación no escala como debería"...
¿Se te ocurre alguna otra razón para no permitir este tipo de situaciones?
Posted from Diario de un Dotnetero | 0 Comments
Filed under:

Aguas con el XSS

Ahora que se determinó que las vulnerabilidades de cross-site scritpting (XSS) son las número uno de todos los tiempos, es importante saber qué implicaciones tiene para tus aplicaciones Web hechas con ASP.NET. Afortunadamente, desde la versión 1.1, el .NET Framework trae activados por default la validación de los requests hacia tu servidor, pero aún así esto no es suficiente.

Ah, y si crees que la injección de tantito javascript no es peligrosa, ve este video. Está grandecito, pero vale la pena (127Mb, QuickTime).

Libros para principiantes y no tan principiantes

Ayer me comentó Teo Ortega que va a tener que portear una aplicación “cliente/servidor” hecha en Delphi a .NET. Al parecer aunque esta aplicación era adecuada (de hecho consume Web Services de una aplicación hecha en ASP.NET), algunas limitantes en la conectividad y flexibilidad del sistema han forzado al cambio de plataforma.

Como el Teo apenas va a comenzar a dotnetear, pues la inevitable pregunta fue “Oye, ¿y no tienes algún libro que me ayude en este rollo?”

Creo que todos hemos estado ahí. Así que le envié una larga lista de libros que me han sido útiles desde que comencé con este rollo y pensé que les podrían ser útiles a ustedes también—de hecho sí me cayó el veinte de “ay we’, ¿de veras he leído todo esto?”

La mayoría de estos libros los pueden leer en línea en sitios como books24x7. En la empresa donde trabajo tenemos un acuerdo corporativo, así que todos los empleados tenemos acceso. Otra alternativa podría ser Safari. En lo personal, prefiero libros en formato arbol-muerto, pero (1) leo más rápido en línea—por alguna extraña razón—y (2) no tengo tanta lana como para comprar todos los libros en sitios como estos. Así que hagan lo que puedan. Si deciden comprarlos en papel, este sitio es útil para encontrar el mejor precio.

En general, los mejorcitos que he encontrado son de Apress—a donde acabaron muchos autores que dimitieron de Wrox Press—y de ahí, los publicados por Microsoft. Aunque todo depende de qué tema se quiera aprender.

Así que aquí está la lista, separada por contextos generales.

Fundamentos
Mucha raza que me he topado ha aprendido a dotnetear a punta de voluntad, pero desgraciadamente les falta comprender conceptos fundamentales del .NET como plataforma. Para ellos recomendaría Microsoft .NET Core Requirements (Microsoft Press, 2003). Este es un paquete de 4 libros que son para preparase para una certificación MCAD o MSCD (versión 1.x del Framework).

Lo bueno:
  • Trae todos los ejemplos en los dos lenguajes más populares (C# y VB.NET)
  • Cubre todo lo mínimo elemental que debe saber un desarrollador a la hora de dotnetear (y uno que otro truquito que nomás MS se sabe).
  • Cubre material para los diferentes tipos de aplicaciones que se pueden crear (WinForms, Web, Windows Services, Web Services)
Lo malo:
  • Para en verdad sacarle jugo hay que chutarse al menos 3 de ellos—el cuarto es completamente teórico y trata sobre MSF y metodologías y herramientas para desarrollar software—esto es porque fueron escritos por distintas personas en MS, así que hay bastante redundancia y no son uniformes.
  • Algunas cosas decididamente están fechadas. Por ejemplo, al hablar de armazones de pruebas, habla de construir los propios con escripts, siendo que NUnit lo suplantó por de facto; no hay ni mención de las especificaciones WS-I para Web Services, etc.
Aún así lo recomiendo porque varios capítulos, por separado son muy buenos y concisos, p.ej. el de Developing Windows-based Applications explica muy bien conceptos de los lenguajes como overloading, interfaces, delegates, etc., el de Developing XML Web Services and Server Components trae una excelente explicación de qué es el .NET Framework, cuáles son sus “partes” cual es el papel de cada una de ellas y qué features son los que aporta.

Ahora que si van a comenzar en aplicaciones Web con el Framework 2.0 Pro ASP.NET 2.0 in C# 2005 (Apress, 2005) se ve muy bueno. Cubre desde lo fundamental, hasta lo “Pro”.

Más avanzadones
Si buscan un buen Framework para objetos de negocio, están los libros del Rocky Lhotka, en su versión C# o VB.NET. Yo me esperaría un poco y compraría la edición que va a salir en los próximos meses ya que (1) está hecha para el Framework 2.0 y (2) integra muchos features que le fue agregando al CSLA basado en retroalimentación de sus lectores y basado en capacidades nuevas en las herramientas.

Como lo mencioné ayer, Expert ASP.NET 2.0 Advanced Application Design: ASP.NET as a distributed application hosting environment (Apress, 2005) es un excelente libro para hacer la arquitectura de un sistema con tecnologías dotnetescas.

No-.NET, pero relacionados
Si no saben UML, aprendan ¡ya!—tiene ya como 10 años por el amor de Dios. Uno de mis favoritos es UML Distilled: A Brief Guide to the Standard Object Modeling Language, Third Edition de Martin Fowler. Este vato propone utilizar UML como una herramienta útil para bosquejar un sistema.

Para una sólida base de diseño de bases de datos relacionales especialmente relacionados a programación orientada a objetos, lean Beginning Relational Data Modeling, Second Edition (Apress, 2005). De haber leído este librito antes, hubiera evitado algunos errores en el diseño a la hora de implementar relaciones superclase/subclase en una aplicación que esos errorcillos acabaron dando enormes dolores de cabeza.

Finalmente, y hablando de base de datos y orientación a objetos, está Information Modeling and Relational Databases: From Conceptual Analysis to Logical Design (Morgan Kaufmann Publishers, 2001) de Terry Halpin, que cubre ORM—no Object-Relational Mapping, sin Object-Role Modeling—una metodología muy sencilla y muy útil para modelar los requerimientos de un sistema y automáticamente generar el diseño lógico y físico de una base de datos, incluyendo muchas de las “reglas de negocio en un sistema”. Incluso enfatiza el porqué UML es una muy mala metodología para hacer un modelo de datos. Los detalles de cómo aplicar ORM con Visio lo cubre también muy bien en este otro libro. ORM es, en mi humilde opinión, una de las herramientas más utiles y menos utilizadas.

Enjoy.

ASP.NET para hombres

Disclaimer #1: Aunque vaya a parecer comercial, no tengo nada que ver con los autores del libro o con la editorial. Simplemente me cayó tan bien el libro que tuve que escribir sobre él.

Disclaimer #2: No estoy siendo sexista. Al decir “para hombres” es en el sentido “vs. niños, amateurs, principiantes”, no “vs. mujeres”. Las mujeres son la neta.

Disclaimer #3: Este post está intencionalmente “pocho”. Hay cosas en jerga computacional y citas textuales que francamente me da flojera traducir.

Yo soy extremadamente codo para comprar libros técnicos. La verdad es que si voy a pagar 60 dólares por un pedazo de árbol muerto con letritas, más vale que las letritas sean muy buenas, ya que la herramientas cambian tan rápido que la vida útil de un libro técnico es de solo un par de años, a lo mucho.

Aún recuerdo cuando me llegó mi copia de Professional VB 5 Business Objects (Wrox Press, ¿1997?), por un tal Rockford Lhotka, que abogaba el uso de la arquitectura en capas y el uso de UML. Cuando años más tarde, en el trabajo comencé a hacer cosas dotneteras™ más en serio, sugerí la versión de .NET de su libro—recién sacadita de la imprenta si mal no recuerdo—para el proyecto y la adoptamos como el armazón de nuestra aplicación con bastante éxito. Esa es la clase de libros que te “dan de comer” por varios años y vale la pena comprar.

En esa misma categoría pues, he puesto a Expert ASP.NET 2.0 Advanced Application Design: ASP.NET as a distributed application hosting environment (Apress, 2005). Que si hubiera sido yo el autor, probablemente le habría puesto como título “ASP.NET para hombres”. En mi humilde opinión, este libro debería ser lectura requerida para cualquier desarrollador .NET profesional.

¿Por qué? Porque más que un libro más sobre ASP.NET es un libro sobre arquitectura de software aplicando herramientas que se llevan bien con el .NET. Y no solo es para aplicaciones Web o Web Services, el contenido aplica para casi cualquier tipo de aplicación que se necesite desarrollar con las herramientas que se tienen en este momento, y cómo se relaciona con las que están en puerta (como Windows Communication Foundation).
“And so in designing this book we decided that we did not want to do the standard ‘new feature march.’ This book is not a general introduction to version 2.0 of the ASP.NET Framework. Instead, this book focuses on designing distributed applications using the .NET Framework as your platform. With this as our focus, we treat ASP.NET not as an environment for the generation of HTML, but rather as an application hosting environment, one capable of servicing requests not just for Web Forms, but also for Web Services, for distributed objects via Remoting, even for your own custom application hosting needs. By treating ASP.NET as an application server instead of as a web application development environment, our field of view is dramatically increased.” (p. xix)
Y no es exageración. Después de leerlo sentí que mi arsenal de herramientas se había incrementado dramáticamente.

El libro comienza con algo de “teoría” básica sobre arquitectura donde me topé con algunas citas con las cuales estoy totalmente de acuerdo:
“You'll need to consider more than the business-based, functional requirements. When you're designing the architecture, functional requirements may be relevant, but they're usually secondary to other application requirements, which aren't captured in the ‘Use Cases.’” (p. 3)
[Traducción: la arquitectura de un sistema se saca de todas las “-abilidades” (mantenibilidad, ecalabilidad, etc.), no tanto de los requerimientos]
“The answer to any question when it comes to architecture is ‘it depends’. This is why you make the big bucks.” (p. 4)
[Refiriéndose a la importancia de la mantenibilidad y flexibilidad en los sistemas:]
“Checking a code file out of source control and having a developer make changes to it is the most expensive kind of change that can be made to a system. It requires a developer (not cheap). It requires the recompilation of binaries. It requires regression testing of all areas of the application that are affected by a change to that binary (testers, automation, and time: aka more money). And then it takes a deployment and all of the requisite worry, heartache, and long hours that can accompany that.” (p. 12)

Después de algunas arquitecturas de ejemplo, el libro pasa rápidamente a explicar el ASP.NET Execution Pipeline, en otras palabras, qué pasa desde que un request le llega a IIS hasta que la página es rendereada y todos los puntos de extensibilidad en el proceso.

Al principio me era un poco amenazante, pero gracias a la muy amena redacción que tiene, de-mistificó rápidamente cosas que para mi hasta ahora habían sido “magia” de ASP.NET. Conforme avanzas en la lectura comprendes perfectamente cómo Microsoft implementó muchos de los features de ASP.NET (Forms Authentication, el handler de Web Services, etcétera). Y una vez que se entiende eso, el modelo (en capítulos posteriores) para entender Web Services Extensions (WSE) y hasta WCF es esencialmente el mismo. Whoa.

Podría hacerles un resumen casi por capítulo de cosas que me gustaron en cada uno de ellos, pero para no hacer el cuento muy largo les voy a poner las cosas principales que aprendí o me gustaron de este libro:
  • Qué tecnologías están disponibles hoy, qué features proveen y cómo decidir cuándo usar cuál (a veces los features son ofrecidas por varias de las tecnologías) y cómo emplearlas de forma que provean una migración fácil a las tecnologías que están en puerta (como WCF).

  • Trae un destilado de las muchas definiciones que se han dado de Web Services y de Service Orientation y qué elementos tienen en común. La importancia de entender la diferencia entre SO y OOAD y cual es el papel de cada una de estas filosofías en un sistema distribuido (hint: tiene mucho que ver con la diferencia entre cosas stateful y stateless).

  • La tendencia de Microsoft hacia la programación “declarativa”, como alternativa a la “imperativa”—si alguna vez han utilizado atributos en sus clases o visto código XAML, de esto se trata la programación declarativa.

  • Ejemplos claros, completos, prácticos y concisos de cómo hacer (y no hacer) muchas cosas con el .NET Framework 1.x Aquí me topé con muchas situaciones por las que yo ya había pasado y aprendido a guamazos. (p.ej. qué se tiene que hacer para implementar Forms Authentication), y qué cambios hubo en 2.0 para facilitar esas cosas (p.ej. cómo usar el nuevo MembershipProvider, controles nuevos, etc.).

  • Capítulos detallados en algunas áreas que no se cubren muy bien en la documentación o en otros libros que he visto o leído:

  • Hay un capítulo enterito dedicado la clase Page: qué es lo que sucede a la hora de ejecución, cómo arma los controles, y qué prácticas seguir. Incluye una muy buena explicación en la página 95 de porqué NO es tan buena idea DataBindear un DataSet a un DataGrid—esencialmente acabas gastando 4X el tamaño original de los datos—y qué alternativas hay.

  • Otro capítulo dedicado exclusivamente a ViewState y JavaScript, incluyendo cosas AJAX-escas (Out-Of-Band Callbacks)

  • Una muy buena cobertura sobre Enterprise Services (COM+) en .NET. Aquí aprendí varias cosas que ni sabía que existían, incluyendo Queued Components—componentes que se ponen en una cola de ejecución y automáticamente tienen un proceso “escucha” y los procesa asíncronamente; cómo poder generar Web Services a partir de componentes configurados automáticamente y sin siquiera requerir de .NET
En fin, el libro cubre los temas con un detalle suficiente como para meterse en broncas, y entender el concepto de una manera concreta, pero te deja “picado” para buscar más detalles cuando se ofrezca en la vida real.

Les recomiendo que le den una hojeada al libro o lo compren en su tienda favorita, o si tienen acceso a algo como books24x7.com, ahí también lo tienen.