Welcome to 3Dev Blogs Sign in | Join | Help

[Off-Topic] [APNT] Concurso 20 blogs peruanos (no me voten!)

[APNT] = Advertencia!, post no técnico.

Concurso Blogs Peruanos, Estamos buscando a los 20 mejores Blogs del Perú
Páginas Amarillas

Disculpen el off-topic, sobre todo por la temporada baja de posts. He estado ocupando el tiempo lo que queda después del trabajo en un proyecto personal, y haciendo la tesis para obtener el título de Ing. de Sistemas (ahora sólo tengo el de bachiller en Ing. de Sistemas), y bueno creo que si no hace ahora, no se hace nunca... así que parece que si la hacemos... hay muchos posts en la cola, y cuando se pueda los iremos enviando...

El motivo de la entrada, es debido a un concurso que se esta organizando en los bloggers peruanos: 20 Blogs peruanos. En la cual este humilde blog también esta participando.

Hace más de tres años (Marzo-2005), que me inicie en esto de los blogs y no me arrepiento, me ha dado muchas satisfaciones he conocido a mucha gente, y sin querer queriendo también ha influido en las ofertas laborales que he tenido. Hace más de 2 años que blogueo en Geeks (Junio-2006), chanfle no enviamos el post de celebración del segundo aniversario, y pues sigo repitiendo que es la comunidad de blogs más grande a nivel hispana, en blogs, contenido y calidad. Creo que uno de los exitos de la misma, ha sido convocar a todas las personas de los diversos paises de habla hispana que deseen compartir sus conocimientos, o en mi caso lo poco que sé, con la comunidad. Además de compartir, creo que se aprende muchas más, por los comentarios y por los otros bloggers presentes.

Y pués y nada, si en algo les ha ayudado este humilde blog, alguna de sus dudas ha sido resuelta, los ha motivado a leer un poco más para darme la contra, o simplemente encontraron un tip de bolsillo, pueden hacer llegar su voto a través de la siguiente página: Vota por un blog, no se olvide de escoger la categoría tecnología.

P.D.: Tampoco lo vean como una campaña Spam, no van a ver en el msn: Voten por mi blog menos el clásico no voten por mi blog, es sólo una manera de ver si los que aún quedan suscritos al RSS de blog siguen vistando el blog, y si hay alguien más leyendo el blog.

Por cierto, casí lo olvido, sólo se puede votar hasta el 22 de agosto :D

Saludos,

Crossposting desde ...
posted by starrillo | 0 Comments
Filed Under:

No todos los problemas se resuelven programando, a algunos hay que hacerles la magia...

http://sergiot2.com/blogimages/2008/06Jun/18_magia.jpg

Un post de reflexión :D, y que servirá de referencia a otros.

Recurrentemente ante situaciones donde estás horas y horas, con un problema y no encuentras el código que lo haga funcionar, visitas todos los foros, en español, inglés, y hasta chino, y nada, y a la gente que envías un email esta apretada con sus quehaceres, lo último que queda es hacer la magia.

¿Pero qué es la magia?. La magia es la experiencia, el sentido común, y la habilidad que vas acumulando conforme aumenta tu participación en proyectos (exitosos o no). No se han dado cuenta que su ki, aumenta después de cada proyecto?, pues una manera de comprobarlo es revisando los primeros códigos que hacíamos, y que cuando los revisas, has los llegas a negar... pero esa es otra historia.

Ahora la adquisición de conocimientos es de todo el contexto: compañeros, proyecto, usuarios, y todo lo que rodea al proyecto. aprendes buenas prácticas, aprendes malas prácticas, (ya sabes que no hacer), aprendes de los buenos jefes de proyectos, también de los malos, incrementa tu capacidad de negociación, y tomar responsabilidad, sobre todo para que no tener que resolver bugs de otros te chanten muertitos de otros, aprendes a tratar con las personas, después de tratar con los usuarios, aprendes aguantar a los compañeros chinches, (no se como se dirá en otros países, pero alguien chinche es aquella persona que hace llegar al límite tu nivel de paciencia).

¿Y como aplico la magia para resolver un problema de programación?

Lo primero, es saber donde buscar, y donde preguntar, y a quién preguntar, recordar que probablemente nosotros no seamos los primeros con el mismo problema. El detalle viene en que quizás la solución no encaje en nuestra aplicación, o sea muy trabajosa, o sea muy compleja, entonces la opción es dar una alternativa, al requerimiento del usuario.

Debemos analizar nuevamente el requerimiento y buscar soluciones alternativas, hombre que de alguna manera tienes que satisfacer el requerimiento del usuario. Y estas alternativas dependiendo del requerimiento pueden variar, quizás haciendo cambios en el diseño, lo solucionemos, o quizás anexando información, ya la magia nos dirá que hacer.

Un ejemplo:

Problema: Desde una página aspx, estoy enviando los productos seleccionados en la página, y estoy abriendo un popup a través de JavaScript, pero si los navegadores tienen habilitado bloquear los popups, la aplicación pierde de alguna manera el flujo actual, y si estoy limpiando los productos seleccionados después de hacer postback, los productos seleccionados se pierden, y el usuario no sabe si tiene que volver a seleccionar los productos.

Solución: Buscar el código JavaScript para detectar si el usuario tiene activada esta opción.

Re-Problema: El problema puede venir, por ejemplo si para abrir el popup estamos registrando el código desde una página ASP.NET, y para hacerlo esto necesita un postback, ahora si el postback hace otros eventos, y dependiendo de nuestro código, tengamos que hacer más código para no perder algunas variables que estemos usando, y que todo funcione correctamente, y se hace todo un rollo.

Solución-Alternativa: Cambiar el diseño, e indicar al usuario que productos están seleccionandos. Así, si el navegador usuario tiene habilitado el bloqueo de popups, no tengo que hacer código extra por que le estoy informado cuales son productos seleccionados, y que no tiene que volverlo hacer.

Y eso, no todo se resuelve programando.

Por eso siempre ante alguna pregunta de código media marciana, siempre pregunto cual es el requerimiento, y quizás esta re-pregunta demuestre que no queremos ayudar o desconocimiento del tema que puede ser cierto, pero quizás no necesitemos un código marciano, solo cambiar de alguna manera el requerimiento.

Saludos,

Crossposting desde ...
posted by starrillo | 0 Comments
Filed Under: ,

Elementos html Flash validos por la W3C

Hay que tener algunas consideraciones a la hora de embeber el html de flash en nuestras páginas web y que este sea un código válido por la W3C.

Lo primero que tenemos que tener en cuenta es no usar el objeto embed, que lo encontramos por ejemplo en las referencias de YouTube:

   1: <object width="425" height="344">
   2:    <param name="movie" value="http://www.youtube.com/v/MrMNHwmd9Hc&hl=en">
   3:    </param>
   4:    <embed src="http://www.youtube.com/v/MrMNHwmd9Hc&hl=en" 
   5:           type="application/x-shockwave-flash" width="425" height="344">
   6:    </embed>
   7: </object>

Este objeto embed, no es parte de la especificación XHTML, y por ende no pasara la validación. El ajuste consiste en no usar el objeto embed, y en su lugar sólo usar el objeto param:

   1: <object width="425" height="344" 
   2:      data="http://www.youtube.com/v/42znqcedrX0"
   3:      type="application/x-shockwave-flash" >
   4:    <param name="movie" value="http://www.youtube.com/v/42znqcedrX0" />            
   5: </object>

Veamos el caso por ejemplo de un MP3 Player:

   1: <object type="application/x-shockwave-flash" 
   2:      data="http://sergiot2.com/audio/player.swf"
   3:      width="290" height="24" id="audioplayer1">
   4:    <param name="movie" value="http://sergiot2.com/audio/player.swf" />
   5:    <param name="FlashVars" 
   6:          value="playerID=1&amp;autostart=yes&amp;loop=yes&amp;" +
   7:                 "bg=0xf8f8f8&amp;leftbg=0xeeeeee&amp;lefticon=0x666666&amp;" + 
   8:                 "rightbg=0xcccccc&amp;rightbghover=0x999999&amp;" + 
   9:                 "righticon=0x666666&amp;righticonhover=0xFFFFFF&amp;" +
  10:                 "text=0x666666&amp;slider=0x666666&amp;track=0xFFFFFF&amp;" +
  11:                 "border=0x666666&amp;loader=0x9FFFB8&amp;" + 
  12:                 "soundFile=http%3A%2F%2Fsergiot2.com%2Faudio%2FGeorgeMichael-Faith.mp3" />
  13:    <param name="quality" value="high" />
  14:    <param name="menu" value="false" />
  15:    <param name="bgcolor" value="#FFFFFF" />
  16: </object>

NOTA: En el atributo value use "+" para concatenar por cuestión de espacio en el blog se debería colocar todo junto sin concatenar. Notar además como a través de la parámetro FlashVars, podemos pasar variables al objeto flash, si es que lo necesitará. Si desea MP3 Audio Player en su sitio web:

Si desean verificar la validación, pueden hacerlo en la siguiente página: http://sergiot2.com/blog/validW3C.aspx.

Mas sobre el tema de Flash, y la validación:

Saludos,

Crossposting desde ...
posted by starrillo | 0 Comments
Filed Under: ,

Cuando una aplicacion deja de funcionar, por la conexion a la BD

El otro día estaba revisando una aplicación, que inexplicablemente dejo de funcionar el acceso a datos. No se mostraba nada en la portada, no había información, -chess... nos hackearon. Pero revisando la base de datos todo estaba bien, toda la información estaba como debería estar. Era una aplicación Web de terceros, revise la configuración del proveedor de acceso a datos, y entre una de las configuraciones que era SQL Server, me decía que no se podía establecerla conexión, sin más detalles. Pero la base de datos estaba online y funcionando correctamente, comencé  a indagar cuales fueron los últimos cambios, si se instalaron add-ins, o se cambio alguna configuración, y nada.

Para la conexión estaba usando un login SQL, así que entre con ese usuario por el SQL Server Management Studio, y el mensaje fue clarísimo:

SQL Server 2005 - Your password is expired.

"You password is expired. You must enter another password before you can log on".

Y esto debido que durante la creación del usuario marcaron la opción, "Enforce password expiration":

SQL Server 2005 - Enforce password expiration

Cabe resaltar que esta feature de SQL Server 2005 sólo funciona sobre Windows Server 2003 (imagino que W2k8 también debe funcionar).

La recomendación es activar esta opción, por medidas de seguridad. Pero imagino que cada organización tendrá sus propias políticas. Pero vamos al tema, que pasa si habilito la opción, que recomendaciones se debe tener en la aplicación.

¿Dónde cambiamos el número de días de expiración?

Pues usa la misma política que las cuentas de Windows. Nos vamos Herramientas administrativas, e ingresamos a Local Security Policy. Dentro de Account Policies -> Password Policy, cambiamos los días para la edad máxima del password.

http://sergiot2.com/blogimages/2008/06Jun/12_LocalPolicy.jpg

Nota: Estas son las configuraciones por defecto, no la tomen como ejemplo, aún no soy el indicado para hablar de estos temas, todavía no me han dado completamente un server para jugar (6). Artículo relacionado al tema: SQL Server 2005 Login Properties to Enforce Password Policies and Password Expiration.

¿Y cómo le digo a la aplicación que cambie el password?

Pues el administrador debería tenerlo agendado en el Outlook con un reminder de un par de días. Pues si no pasa esto, podemos activar alertas programáticamente, para notificar ante la necesidad de cambiar la cadena de conexión.

   1: static void Main(string[] args)
   2:    {
   3:      String cn = "data source=192.168.1.8; database=northwind; uid=tinysa; pwd=password";
   4:  
   5:      using (SqlConnection sql = new SqlConnection(cn))
   6:      {
   7:        using (SqlCommand cmd = new SqlCommand(
   8:                        "SELECT * FROM Customers WHERE CompanyName LIKE 'a%'",
   9:                        sql))
  10:        {
  11:          try
  12:          {
  13:            sql.Open();
  14:            SqlDataReader rd = cmd.ExecuteReader();
  15:  
  16:            Console.Write("Customers: ");
  17:            while (rd.Read())
  18:            {
  19:              Console.WriteLine("{0}, ", rd["CompanyName"]);
  20:            }
  21:  
  22:            sql.Close();
  23:          }
  24:          catch (SqlException sqlEx)
  25:          {
  26:            if (sqlEx.Number == 18487)
  27:            {
  28:              //send email, sms a webMaster.
  29:              Console.WriteLine("El password de la conexion ha expirado");
  30:            }
  31:          }
  32:          catch (Exception ex)
  33:          {
  34:            Console.WriteLine("hubo un error: {0}", ex.ToString());
  35:          }
  36:        }
  37:      }
  38:  
  39:      Console.ReadLine();
  40:  
  41:    }

NOTA: El ejemplo es didáctico, la cadena de conexión debería ser colocada en el archivo web.config, y este debería ser encriptado.

Notar que el código de Error de SQL de este mensaje es el número 18487, y si sucede este problema podemos enviarle un mensaje por msn, bloquearlo hasta que cambie la cadena de conexión y lo actualice en el web.config configurar para enviarle un email al encargado de la Web o Aplicación, notificándole lo sucedido.

Hay otros tipos de errores, que también podríamos considerar:

  • 15113 - Login failed for user '%.*ls' Reason: Password validation failed. The account is locked out.
  • 18463 - Login failed for user '%.*ls'. Reason: Password change failed. The password cannot be used at this time.
  • 18464 - Login failed for user '%.*ls'. Reason: Password change failed. The password does not meet policy requirements because it is too short.
  • 18465 - Login failed for user '%.*ls'. Reason: Password change failed. The password does not meet policy requirements because it is too long.
  • 18466 - Login failed for user '%.*ls'. Reason: Password change failed. The password does not meet policy requirements because it is not complex enough.
  • 18467 - Login failed for user '%.*ls'. Reason: Password change failed. The password does not meet the requirements of the password filter DLL.
  • 18468 - Login failed for user '%.*ls'. Reason: Password change failed. An unexpected error occurred during password validation.
  • 18487 - Login failed for user '%.*ls'. Reason: The password of the account has expired.
  • 18488 - Login failed for user '%.*ls'. Reason: The password of the account must be changed.

Extraído de: Changing Passwords Programmatically. Imaginen que el administrador creo el user, y marco la opción cambiar el password la primera vez de login, y no lo haga y nos de esa password para conectarnos a la aplicación... hay casos....

Hay otra opción, y es cambiar el password a través de una página de administración. La clase SqlConnection, tiene un método llamado ChangePassword, para esta tarea. En esta referencia hay un código ejemplo, sólo hay que agregar la siguiente línea (la número 5):

   1: private static string ModifyConnectionString(
   2:        string connectionString, string NewPassword)
   3:    {
   4:      //AGREGAR ESTA LINEA
   5:      SqlConnection.ChangePassword(connectionString, NewPassword);
   6:  
   7:      // Use the SqlConnectionStringBuilder class to modify the
   8:      // password portion of the connection string. 
   9:      SqlConnectionStringBuilder builder =
  10:          new SqlConnectionStringBuilder(connectionString);
  11:      builder.Password = NewPassword;
  12:      return builder.ConnectionString;
  13:    }

Es como cambiarla usando el Sql Server Management Studio, y este código podríamos incluirlo dentro de las páginas de administración, ya que necesita que algún admin ingrese el nuevo password para el usuario.

Saludos,

Crossposting desde ...

no que no, Geeks.ms en el buscador de firefox :D, y mas.....

Desde hace tiempo que vengo usando y agregando todos los sitios comunes que visito, al buscador de IE, ya que te da mucha flexibilidad para agregar un nuevo buscador, y hasta se puede hacer que el buscador te de algunas otras funcionalidades, como la de validador.

Pero Firefox, no te da está misma flexibilidad, bueno sin add-ins y en la instalación por defecto, no he logrado hacerlo. Pero Firefox si soporta OpenSearch, pero no todos los sitios tienen habilitado el OpenSearch :(, y hasta esperar que lo habiliten...

Pues existe una solución muy sencilla y práctica, basada en OpenSearch, y es simular nosotros la página con el descubrimiento para búsquedas. La receta:

   1. Primero creamos un archivo Xml, con el siguiente código:

   1: <OpenSearchDescription>
   2:    <ShortName>Geeks.ms Search</ShortName>
   3:    <LongName>
   4:      Geeks.ms - Todo lo que los geeks de Windows y .Net tiene que contar
   5:    </LongName>
   6:    <Description>
   7:      Geeks.ms - Todo lo que los geeks de Windows y .Net tiene que contar.
   8:    </Description>
   9:    <Tags>buscador, asp.net, windows, search, visual studio</Tags>
  10:    <Url type="text/html" template="http://geeks.ms/search/SearchResults.aspx?q={searchTerms}"/>
  11:    <Image height="16" width="16" type="image/x-icon">http://geeks.ms/favicon.ico</Image>
  12:    <Attribution>
  13:      Copyright http://sergiot2.com/blog. All rights reserved.
  14:    </Attribution>
  15:    <SyndicationRight>open</SyndicationRight>
  16:    <AdultContent>false</AdultContent>
  17:    <Language>es</Language>
  18:    <OutputEncoding>UTF-8</OutputEncoding>
  19:    <InputEncoding>UTF-8</InputEncoding>
  20: </OpenSearchDescription>

Por poner un ejemplo. El shortName es lo que aparecerá en el cuadrito de búsqueda, atención con la URL, y como enlazamos a la búsqueda, image para el icono, y otros atributos.

   2. Ahora en la página deseada y dentro del elemento head, agregamos lo siguiente:

   1: <link title="Geeks.ms Search" type="application/opensearchdescription+xml" 
   2:         rel="search" href="searchGeeks.xml" />

Notar, que acá hacemos referencia al archivo xml, creado previamente.

   3. Ahora sólo nos queda abrir la página en cuestión: http://sergiot2.com/blog/searchEngine.aspx, en Firefox obviamente.

   4. Nos vamos al buscador, y agregamos el buscador para "Geeks.ms Search". Notar que en la opción de agregar saldrá el icono del sitio donde estén, en este caso, el icono de mi sitio:

http://sergiot2.com/blogimages/2008/06Jun/06_addSearch.jpg

5. Pero no se preocupen no van a tener que ver el feo icono :D, después de agregar el buscador ya toma el icono asignado en el archivo xml:

http://sergiot2.com/blogimages/2008/06Jun/06_searchGeeks.jpg

No son grandes cosas, pero siempre ahorra un poco de tiempo para búsquedas en sitios que usamos con mayor frecuencia.

Ahora sólo deje tres buscadores, el de Geeks.ms para buscar entradas y no repetirlas, o alguna entrada que vi y necesito, mi blog que también uso como repositorio de algún código, y el MS Events, que visito de vez en cuando para buscar un WebCast, este último esta programado para buscar WebCast en inglés, si desean le hacen el cambio en la URL para buscar los de nuestro idioma.

P.D.: A medida que los vaya necesitando voy a ir agregando otros buscadores que uso, da mucha lata hacerlo todos juntos :D.

Saludos,

Crossposting desde ...
posted by starrillo | 0 Comments
Filed Under: ,

Moviendo Aplicaciones Web ASP.NET 2.0 a IIS 7.0?

A ver veamos, nosotros tenemos dos modos de correr una Aplicación Web en IIS 7.0, en modo clásico o en modo integrado, y esto lo configuramos a nivel de un Application Pool.

El modo clásico, es como conocemos al trabajo de ASP.NET con IIS 6.0, el modo integrado es nuevo modelo de trabajo de IIS 7.0, que entre una de las features, me van permitir extender mi servidor, y usar funcionalidades propias que sólo tenia en ASP.NET, con otros lenguajes como Php, ASP clásico, o en páginas estáticas. Revisar el siguiente enlace para mayores detalles: ASP.NET Integration with IIS7.

Ahora, estoy moviendo una Aplicación Web ASP.NET que funciona de lujo en IIS 6.0, a trabajar con IIS 7.0, ¿qué recomendaciones debemos tener?

Primero, si estamos presionados y debemos hacer el cambio de aplicaciones Web a IIS 7.0, para ayer, la opción altamente recomendable es usar el modo clásico (configurar el Application pool). Tenemos que tener permiso para administrar el servidor, nos vamos a Application Pools, y verificamos que por lo menos uno de ellos o creamos uno nuevo, tenga la propiedad Managed Pipeline Mode, en Classic. Con esta configuración si nuestra aplicación Web funcionaba bien en un servidor IIS 6.0, debería funcionar bien en un servidor IIS 7.0.

Application Pool - Advanced Settings

¿Qué pasa si a nivel de un Web Site, solo tengo un Application Pool?, y para no perjudicar a otras aplicaciones Web, debo mantener el modo integrado, que será para todas las Aplicaciones Web dentro del Web Site. Hay algunos cambios que debemos hacer, si estamos usando determinas features.

Por ejemplo si estamos usando modules o handlers, que están agregados en el web.config, al ejecutar la aplicación Web, obtendremos el siguiente error: HTTP Error 500.22 - Internal Server Error, "An ASP.NET setting has been detected that does not apply in Integrated managed pipeline mode".

Y el problema es que en el modo integrado, los modules y handlres, deben ser colocados dentro de las secciones <modules>, y <handlres>, de la sección <system.webServer>. Este último nos permite hacer configuraciones a nivel de IIS, y llevárnosla en la aplicación dentro del web.config, y no tener que replicarlas en un nuevo servidor.

La solución para este escenario es sencilla, podemos usar el siguiente comando, AppCmd.Exe, que hará la migración de las secciones en el web.config:

> %windir%\system32\inetsrv\Appcmd migrate config "<ApplicationPath>"

Donde:

  • "<ApplicationPath>" = "Default Web Site/"  o
  • "<ApplicationPath>" = "Default Web Site/WebApplication/"

Si todo salió bien, nos deberá salir un mensaje: Successfully migrate section "system.web./httpModules" | "system.web/httpHandlers".

Para mayores detalles sobre los cambios o features, en las cuales debemos tener cuidado, revisar: ASP.NET 2.0 Breaking Changes on IIS 7.0.

Atención, si la migración al modo Integrado les esta dando mucha lata y necesitan la Aplicación Web, lo mejor será usar el modo clásico. Lo ideal debe ser probarlo localmente (no producción), si todas las features de nuestra Aplicación funcionan correctamente en el modo integrado, antes de subirla a producción.

Saludos,

Crossposting desde ...
posted by starrillo | 0 Comments
Filed Under: ,

[Demo] Usando el nuevo control ListView de ASP.NET con VS2008

Llegando un poco tarde, pero aquí están las demos del evento pasado: Descargar demo.

Es un sitio Web, para el Upload y Search de productos. Las páginas implementadas son el Upload Manual:

Upload Manual

Y la página search:

 Search Products

Para el diseño de la aplicación usa la plantilla Commerce, de los Templates for ASP.NET. Estos son algunas entradas relacionadas al tema: VS2008 - CSS for Developer (Dummies Designers), e Instalar un ASP.NET Starter Kit, paso a paso.

Es una aplicación en capas simple, creada usando Visual Studio 2008, puedes descargarse un trial de Visual Studio 2008 Professional, para revisar la aplicación. Para la generación de la capa de acceso a datos use el Web Service Software Factory, no es necesario tenerlo instalado para ejecutar la aplicación, revisar la personalización realizada para agregar nuevos métodos a los que soporte por defecto, ya que el ObjectDataSource que vamos a usar más adelante necesita un método contar, par la paginación personalizada.

En la primera demo puede ver el uso de ListView+ObjectDatasSurce, habilitado con la función para insertar registros (lo que falta al gridView, ya que sólo permite update, y delete). Se ve también como manejar eventos de inserción (agregar parámetros antes de que se produzca la inserción, o realizar tareas después de la inserción como el manejo de errores). Además como buscar controles en el ListView, y como agregar comandos adicionales a un ListView.

En la segunda demo hay un search de products, y se hace paginación personalizada tanto de SQL como de ASP.NET, usando el ObjectDataSource, además de soportar ordenamiento. Y el ObjectDataSource te va de lujo cuando pasas Objetos y List<Objetos>, entre tus capas, un buen artículo relacionado a esto: Performance: Datos en Memoria con ADO.NET IV.

Y para los estilos (CSS) del ListView, los descargue desde la siguiente página: CSS Table Gallery. Ah dentro de la descarga se encuentra los scripts necesarios para generar la base de datos en SQL Server 2005.

Creo que eso es todo, nuevamente: Link de descarga.

Otros artículos sobre el ListView:

P.D.: Hay algunas tareas pendientes en el Sitio Web, que por cuestiones de tiempo ya no se pudo hacer, como el uso de configSections, en el web.config por ejemplo. En futuras entregas espero ponerle más cosas, que está será la nueva aplicación para demos :D.

Saludos,

Crossposting desde ...

[CelulaUNT.Net]: Cansado de overview y novedades?, Evento post-lanzamiento

Si ya has asistido a un evento de Lanzamiento, y deseas explorar a detalle alguna de las novedades de los nuevos releases de Microsoft, la Célula UNT .Net esta organizando un evento, en la ciudad de Trujillo-Perú: Aprendiendo con las nuevas tecnologías {Microsoft 2008}:

Clic para agrandar

El evento será el Viernes 30 de Mayo por la tarde en la Universidad Nacional de Trujillo (UNT), si deseas ver la agenda en detalle puedes hacerlo aquí, y si deseas la ubicación exacta, hicieron un mapa. Pueden registrarse en la siguiente página: Registro Evento.

Yo estaré participando con el tema de Escenario de Acceso a datos con el nuevo control ListView de ASP.NET, hay algunos artículos interesantes en MSDN Magazine sobre este control, estaré mostrando algunas de las cualidades de las cuales podemos sacar provecho, soporte de inserción a comparación del GridView, el manejo total del render del html, con los anteriores controles debemos usar CSS Control Adapter para manejar el render del html, y además de esto con soporte de los controles DataSource, que soporte paginación customizable, son muchos los escenarios que podemos explotar con este control, y esperamos abordarlas en el evento, además de acompañarlas de algunas otras features, como  el uso de Linq to Objects, uso del paquete Data Access del Service Factory, entre otras.

P.D.: Después de la charla, subiré la presentación (si hay, si da el tiempo), y las demos que siempre se terminan de alguna manera durante la sesión evento, si no terminaron antes

Saludos,

Crossposting desde ...

[CodeSnippet] Borrar masivamente procedimientos almacenados

Iniciamos una nueva sección en el blog, llamada Code Snippets, serán pequeñas porciones de código simples o algunas marcianas, pero que siempre son útiles, ya se para el trabajo, para preparar un demo, o un código rebuscado.

Problema: He restaurado una base de datos usando la herramienta SQL Database Publishing, para una demostración, y estoy actualizando/recreando los store procedures, y el problema era que deseaba eliminar masivamente los store procedures, que tengan un determinado patrón. Puedes eliminar los store procedures, desde SQL Server Managment Studio, haciendo clic derecho sobre el procedure, y seleccionando delete pero uno por uno, si hubiera un shift select/delete, y la otra forma, hasta donde se :$ , es haciéndolo por código, y esta es la que vamos a explotar.

Plataforma: SQL Server 2005, query a nivel de base de datos.

   1: use dbGeekProducts
   2: go
   3: DECLARE @SPs varchar(max)
   4: SET @SPs = ''
   5: SELECT @SPs = @SPs + [name] + ',' FROM sys.objects
   6: WHERE type = 'P' AND name LIKE 'usp_%'
   7:  
   8: SELECT @SPs
   9: go

En mi caso yo quiero eliminar todos los store procedures de una base de datos que empiecen con el nombre "usp_%". El detalle de DROP PROC, es que no acepta strings o variables, si no nombres de objetos. De ahí el tip de hacer SELECT @SPs. Copio el resultado del SELECT, remuevo la última coma, y lo pego dentro del siguiente código:

   1: DROP PROC usp_Product_Insert,usp_Product....
   2: go

Si alguien tiene alguna otra o mejor forma, favor de  comentarlo :D.

P.D.: Imagino que con VS for Database Professionals, puede hacer esto con shift/control select.

Saludos,

Crossposting desde ...
posted by starrillo | 0 Comments
Filed Under: ,

[Off-Topic] Blogs de la Celula UNT .Net

Una noticia que me causo mucha alegría es la liberación de los blogs de la Célula UNT .Net. Antes había blog personales de estudiantes, pero no como equipo, no como Célula UNT .Net, puede ser enriquecedor sobre salir personalmente, pero sobresalir como grupo humano es mucho mas enriquecedor, ya Luis Fraile compartió algunas reflexiones sobre el compañerismo las cuales comparto.

En algunos casos alcanzar este tipo de objetivos es un poco difícil ya que no se cuenta con el apoyo de las autoridades o de la misma Universidad, algunas veces por que la facultad es nueva y no tienes el apoyo docente, otras por cuestiones políticas dentro de la universidad, y algunas veces por racismo de software (anti-microsoft o anti-inux). Mis felicitaciones para todo el grupo que hizo posible esto sobretodo porque ellos mismos están financiando la Web ideal debería ser que la Universidad de algún sub-hosting dentro de su mismo sitio Web, tener la Web de la Célula UNT .NET fue siempre un deseo del grupo de la Célula en los años en que participe, pero no se pudo hacer,  y si en algo ayudo mi participación cuando fui parte de la Celula UNT .Net, pues me siento muy a gusto y satisfecho.

Lo que más gusto me da, es que la mayoría de los Bloggers UNT, están en media carrera recién ahondando en la carrera, ya que los primeros años son de cursos generales, y no se si habrán percatado o enterado, pero actualmente tener un blog te ayuda mucho en tu vida profesional. Algunos imagino que recién están ingresando al mundo .NET, quizás unos con mas experiencia que otros, pero en un año o menos, espero leer entradas sobre los proyectos en los que estén trabajando, y como están aplicando .NET, mejores prácticas, patrones, bloques de código, herramientas, y todo los chiches que hay, etc, etc...

Si están buscando jóvenes talentos, estos son los Blogs: http://celulaunt.net/community/blogs/Bloggers.aspx.

P.D.: Creo que el siguiente objetivo debe ser participar en el Imagine Cup.

Saludos,

Crossposting desde ...
posted by starrillo | 0 Comments
Filed Under: ,

Serie de WebCast: Introduction to SharePoint for .NET Developers

El día de hoy empezó una serie de WebCast de SharePoint orientada a los .NET Developers.

En el de WebParts del día de hoy, primero de la serie, contó con alrededor de 400 asistentes online, no había visto tanta gente en un WebCast desde la clásica batalla C# vs VB.Net. Además de estar muy claro y simple de entender, e imagino que los demás serán del mismo tipo.

Los WebCast son nivel 100, todos en inglés. El primero, a la fecha de hoy, ya lo podemos ver bajo demanda, y los demás podemos a llegar a verlos online, igual si no llegamos lo podemos ver después bajo demanda. Lo interesante de poder asistir a un online, es la capacidad de poder hacer preguntas a los speakers de los Webcast, si han tenido alguna pregunta o duda con alguno de los temas, puede aprovechar el WebCast para hacerla.

  1. 20080520 - MSDN Webcast: Introduction to SharePoint for .NET Developers: Web Parts (Level 100). Por Robert Bogue.
  2. 20080521 - MSDN Webcast: Introduction to SharePoint for .NET Developers: Data Lists (Level 100). Por Robert Bogue.
  3. 20080527 - MSDN Webcast: Introduction to SharePoint for .NET Developers: Silverlight and SharePoint Server (Level 100). Por Andrew Connell.
  4. 20080528 - MSDN Webcast: Introduction to SharePoint Server for .NET Developers: Using Event Handlers (Level 100). Por Andrew Connell.
  5. 20080603 - MSDN Webcast: Introduction to SharePoint for .NET Developers: Page Branding (Level 100). Por Andrew Connell.
  6. 20080604 - MSDN Webcast: Introduction to SharePoint for .NET Developers: Workflows (Level 100). Por Robert Bogue.
  7. 20080610 - MSDN Webcast: Introduction to SharePoint Server for .NET Developers: Web Services (Level 100). Por Andrew Connell.
  8. 20080611 - MSDN Webcast: Introduction to SharePoint Server for .NET Developers: Page Navigation (Level 100). Por Andrew Connell.
  9. 20080617 - MSDN Webcast: Introduction to SharePoint for .NET Developers: User Management (Level 100). Por Robert Bogue.
  10. 20080618 - MSDN Webcast: Introduction to SharePoint Server for .NET Developers: Custom Content Types (Level 100). Por Robert Bogue.

Saludos,

Crossposting desde ...
posted by starrillo | 0 Comments
Filed Under: ,

IIS 7.0: Administracion Remota a nivel de Servidor, de Sitio, de Aplicacion, de Archivo?

Normalmente los servicios de hosting, proveen una herramienta Web para la administración de un Sitio Web, esta herramienta cuenta con las funciones básicas, stop/restart application, default documents, entre otras features. Pero no es como abrir la consola de administración de IIS. Es ahí donde contar con una herramienta de estas, de poder administrar remotamente un sitio Web a nivel de Web Site (no el servidor), se convierte una herramienta poderosa para los clientes que alquilan un servicio de hosting, y comercial/atractiva para los que ofrecen un servicio de hosting.

Otro escenario, es dentro de nuestra organización, tenemos un WebSite, con dos Web Applications una de ventas y otra de recursos humanos, cada una con su propia administrador, no es lo más recomendado dar permisos mas de los necesarios a cada usuario, es decir, sólo debería poder administrar lo que necesite, y no de otros Web Applications. Además ya no tiene la excusa de ante un problema de tirar el muertito a los demás admins, responsabilizar a los usuarios que tienen los permisos de administración. Habilitando la administración a nivel de Aplicación cada admin es responsable de su Web Application.

Voy a tomar como base copy/paste el siguiente artículo:  Configuring Remote Administration and Feature Delegation in IIS 7.0. Además de acotar algunos detalles que puede no quedar no muy claros.

Empecemos... con la administración de un servidor

1. ServerIIS - Instalar el Servicio. Lo primero que debemos hacer ir al Server Manager, dentro del Role Web Server (IIS), verificar que tengamos instalado el rol Management Service. Este servicio, es el que provee la infraestructura necesaria para habilitar la administración remota en IIS 7.0:

http://sergiot2.com/blogimages/2008/05May/18_ServerManager.jpg

2. ServerIIS - Configurar la Administración Remota. Ahora nos vamos al IIS Manager, seleccionamos el Servidor y dentro del grupo Security, abrimos la feature Management Service. Notar que seleccionamos el servidor, y no un Sitio Web, ya que esta feature esta disponible a nivel de Servidor:

http://sergiot2.com/blogimages/2008/05May/18_ManagementService.jpg

En esta feature, marcamos el check en "Enable remote connections", y en "Identity Credentials", podemos escoger "Windows credentials only" o "Windows credentials or IIS Manager credentials", y el seleccionar una otra va depender de los requerimientos que se tenga, las credenciales de Windows, son los usuarios de la PC, y las credenciales de IIS, es para habilitar a los usuarios de IIS (estos usuario son administrados dentro del IIS). Por ejemplo si yo no quiero crear un usuario Windows por cada Web Application, puedo crear un usuario en IIS Manager, y este usuario será usado para la conexión, si no, será usado el usuario Windows. Ahora otro tema a tener en cuenta, es los permisos que tengamos que dar en los ACLs de los directorios de la aplicación, pero esto lo veremos más adelante.

También podemos escoger el puerto del servicio, y otras features adicionales. Después de escoger nuestra configuración, hacemos clic en el "Apply", para guardar los cambios, y después Start, para iniciar el servicio.

http://sergiot2.com/blogimages/2008/05May/18_enabledRemote.jpg

Un detalle a tener en cuenta es que si reiniciamos el servidor por alguna razón, este servicio no estará iniciado. Si vamos a los Servicios del servidor, podemos cambiar esta feature. Además notar que también podemos cambiar el usuario del servicio de acuerdo las políticas de seguridad que se tenga, por defecto lo instala con la cuenta "Local Service". Recordar este usuario, que será usado más adelante:

http://sergiot2.com/blogimages/2008/05May/18_Web_Management_Services.jpg

Otro detalle a tener en cuenta es verificar que la excepción al servicio "Web Management Service (HTTP)", este habilitada dentro Windows Firewall, que por defecto apunta al puerto 8172, si cambiamos el puerto, tendríamos que agregar la excepción para ese puerto. [OF: Alguien sabe donde se guarda o configura, ¿cuál es el puerto por defecto de un servicio para estas excepciones?]:

http://sergiot2.com/blogimages/2008/05May/18_WFirewall.jpg

3. UserPC - Conexión a un Servidor. Si tenemos un user y password de Windows, con los permisos respectivos, ya podemos usarlos para conectarnos a través del IIS 7.0 Manager Client (para WXP, Vista, y W2k3), que es una descarga adicional para el cliente. Una vez que descargamos el programa, abrimos el IIS 7.0 Manager, y seleccionamos "Connect to a server...":

http://sergiot2.com/blogimages/2008/05May/18_IISManager_Client.jpg

En Server name, ingresamos la IP o dirección del servidor:

http://sergiot2.com/blogimages/2008/05May/18_ServerName.jpg

Nuestro User name, y Password:

http://sergiot2.com/blogimages/2008/05May/18_UserIIS.jpg

Y finalmente asignamos un nombre a nuestra conexión, y hacemos clic en "Finish":

http://sergiot2.com/blogimages/2008/05May/18_ConnectionName.jpg

Y ahora puedo administrar mi servidor IIS 7.0, desde donde quiera que esté con las capacidad que brinda la Consola de administración IIS 7.0 Manager:

http://sergiot2.com/blogimages/2008/05May/18_adminIIS.jpg

 

Pero si yo no quiero habilitar la administración de todo mi servidor, si no solamente un Web Site?

Nota: Si yo tengo una cuenta para administrar todo el servidor IIS 7.0, puedo habilitar la administración remota a nivel de Web Site, y Web Applicación desde mi PC, en caso de no, tengo que hacerlo desde el Servidor de IIS 7.0.

1. ServerIIS - Habilitar la administración remota a nivel de Web Site

Dentro de nuestro Servidor de IIS 7, abrimos la feature IIS Manager Users. Voy a usar usuarios de IIS, y no de Windows, para habilitar la administración remota de un Web Site:

http://sergiot2.com/blogimages/2008/05May/18_IISUsers.jpg

En Actions, seleccionamos Add User, e ingresamos los datos de nuestro usuario:

http://sergiot2.com/blogimages/2008/05May/18_AddUser.jpg

Ahora seleccionamos el Web Site, en el que queremos habilitar la administración remota, y abrimos la feature IIS Manager Permissions:

http://sergiot2.com/blogimages/2008/05May/18_BlogEngine.jpg

En Actions seleccionamos Allow User, seleccionamos el usuario creado previamente, adminBlogEngine, y hacemos clic en OK:

http://sergiot2.com/blogimages/2008/05May/18_AllowUser.jpg

2. UserPC - Conexión a un Web Site

Iniciamos el IIS 7.0 Manager Client, y en Connection tasks, hacemos clic en Connect to a site.

Como puede notar ahora además del nombre del servidor debemos agregar, el nombre del Web Site, que vamos administrar remotamente:

http://sergiot2.com/blogimages/2008/05May/18_ConnectSite.jpg

Los siguientes pasos, son iguales al Connect to a server, debemos ingresar el usuario, que en este caso será el usuario de IIS adminBlogEngine, y finalmente debemos asignar un nombre la conexión.

Seleccionamos nuestro Web Site, y abrimos la feature Directory Browsing:

http://sergiot2.com/blogimages/2008/05May/18_DirectoryBrowsing.jpg

Si en Actions, seleccionamos Enable, para habilitar Directory Browsing, es decir permitir que el usuario puede ver la lista de archivos disponibles en la carpeta solicitada, en nuestro Web Site, obtenemos el siguiente error:

http://sergiot2.com/blogimages/2008/05May/18_EnabledDicBrow.jpg

Filename: MACHINE/WEBROOT/APPHOST/WebSite
Error: Cannot write configuration file due to insufficient permissions

Y el problema es que del lado del servidor, el usuario con el que se esta ejecutando el servicio Web Management Service, que en nuestro caso es la cuenta LOCAL SERVICE, no tiene permisos para escribir en la carpeta del Web Site.

Para darle los permisos necesarios, en nuestro ServerIIS, ubicamos la carpeta del Web Site, hacemos clic derecho en propiedades, y en la pestaña Securtity, hacemos clic en el botón Edit, para editar los permisos, agregamos a la cuenta LOCAL SERVICE, y habilitamos el permisos para modificar:

http://sergiot2.com/blogimages/2008/05May/18_Local_Service.jpg

Atención, este permiso es para cliente de IIS Manager, si es que tenemos habilitado la administración remota, no tiene nada que ver con el permiso del Web Site si vamos a dejar que el usuario suba archivos, recuerden que para eso debemos dar permisos a la cuenta de usuario que tiene asignado el Application Pool.

Y si regresamos a nuestro PC cliente, volvemos a reintentar habilitar el Directory Browsing, y ahora ya no vamos a tener ningún problema:

http://sergiot2.com/blogimages/2008/05May/18_EnableDir.jpg

Pero si quiero ser más granular, y habilitar sólo la administración de un Web Application?

1. ServerIIS - Habilitar la administración remota a nivel de Web Application

Al igual que en el anterior modo, voy agregar un usuario IIS, en mi servidor de IIS con el nombre adminWebClassic.

Selecciono mi Web Application, WebClassic abro la feature IIS Manager Permissions, y agrego al usuario creado previamente adminWebClassic:

http://sergiot2.com/blogimages/2008/05May/18_WebApp.jpg

Recordar que debemos dar los permisos necesarios a la cuenta LOCAL SERVICE, para que pueda modificar el Web Application desde el IIS 7.0 Manager Client.

2. UserPC - Conexión a un Web Application

Iniciamos el IIS 7.0 Manager Client, y en Connection tasks, hacemos clic en Connect to an application.

Ahora además de ingresar Server name, y Site name, debemos ingresar Application name:

http://sergiot2.com/blogimages/2008/05May/18_Connect_Application.jpg

Los siguientes pasos, son iguales al Connect to a server o Connect to a Site, debemos ingresar el usuario, que en este caso será el usuario de IIS adminWebClassic, y finalmente debemos asignar un nombre la conexión.

Y ya puedo administrar mi Web Application:

http://sergiot2.com/blogimages/2008/05May/18_AdminWebApp.jpg

Y si quiero la administración remota a nivel de archivo?

Pues no hay, pero lo que si podemos hacer es decidir que funciones vamos a delegar y cuales no.

Tenemos tres opciones: permitir que pueda ver/modificar una feature, permitir que sólo pueda ver una feature y su configuración, o simplemente no delegar la feature y el usuario no se entera que existe. Vamos a ver un ejemplo:

1. ServerIIS - Delegando features

Dentro de mi Servidor de IIS 7.0, abrimos la feature, dentro de la categoría Security, Feature Delegation:

http://sergiot2.com/blogimages/2008/05May/18_FeatureDelegation.jpg

Primero, en Actions, seleccionamos Custom Site Delegation, seleccionamos el site Default Web Site, seleccionamos la feature que se desea delegar, en nuestro caso Directory Browsing, y en Actions, hacemos clic en Not Delegated:

http://sergiot2.com/blogimages/2008/05May/18_CustomDelegation.jpg

Y si en la PC cliente, nos vamos las features de la categoría HTTP Features, vamos a poder ver que ya no tenemos Directory Browsing. En este caso si ya tenía abierta la sesión de WebClassic, van a tener que reconectarse para actualizar la delegación de features, para ver los cambios aplicados:

http://sergiot2.com/blogimages/2008/05May/18_without_dirbrow.jpg

Conclusiones:

Espero, no decir alguna barbaridad por la hora, que todo en la entrada/post haya quedado claro, y acá sólo vemos un poco del poder de IIS 7.0. Ahora podemos hacer más granular la administración de IIS 7.0, pudiendo llegar a nivel de Servidor, de un Sitio Web, o de una Aplicación Web. Además de poder decidir que features va tener disponible el cliente remoto. Hay algunas opciones en la que no entre en detalles, para no dar más lata con el artículo, pero de acuerdo a sus necesidades ustedes pueden detallar en la mucha información que hay Internet.

P.D.: Ya no doy más lata, y voy a dormir, que en unas horas hay mucho curro/laburo/trabajo, para iniciar la semana.

Saludos,

Crossposting desde ...
posted by starrillo | 0 Comments
Filed Under: , ,

Mini-Poster de IIS 7.0 (Componentes) y Referencia de Modulos

Un mini-poster con los componentes de IIS 7.0:

IIS 7.0 Components

Link: Mini-poster IIS 7.0 Setup Components.

También, aprovecho el post para compartir la referencia de módulos disponibles en IIS 7.0: IIS 7.0 Modules Overview. Al final del artículo van a encontrar una lista-referencia de los módulos, con su descripción, sección de configuración, dependencias y notas del módulo. Como dijo Iván González, en algunos WebCast, ahora vas a poder legolizar tu aplicación con IIS 7.0, es decir vas ir armando y usando los módulos de acuerdo a tus necesidades. Y si has revisado los módulos disponibles con IIS 7.0, y ninguno de ellos satisface tu necesidad pues extiéndelo.

Nuevamente, no se olviden de revisar los módulos disponibles, para no hacer un esfuerzo innecesario en algo que ya esta construido. También no esta demás navegar en la red, quizás alguien ya implemento el módulo que necesitamos, como este que comenta ScottGu: IIS 7.0 Bit Rate Throttling Module Released.

Saludos,

Crossposting desde ...
posted by starrillo | 0 Comments
Filed Under:

[WebCast] C# vs Vb.Net, yo le voy a C# y tu?

C# vs VB.Net

Como recordatorio del WebCast de este martes 6 de mayo. Registro aquí.

Ya Jorge Serrano, hizo una entrada a este clásico debate. Y como dice, siempre y cuando este tipo de charlas no caiga en radicalismos y envidia, y que sea usado para romper el hielo, y conocer un poco más del lenguaje que usamos, creo que el debate es enriquecedor.

Voy a dar mi opinión hablando con el corazón y basado en gustos subjetivamente. Yo empecé, y aprendí a programar con C++, y cuando ingrese al mundo de .Net lo hice con VB.Net. Pero desde que conocí C#, que les puedo decir, me quede con ese lenguaje, y me gusta ver ";" al final de una instrucción, o mis bloques de código encerrado entre llaves. Particularmente siento mi código mas ordenado cuando lo veo en C#.

Pero veamos otro tema:

¿Qué tanto puede influir el lenguaje en el desarrollo de un proyecto?. Pues como ya se dijo en el post de Jorge, técnicamente el lenguaje no es más que un skin para el .Net Framework, no veamos capacidad del lenguaje, si no la productividad que te puede dar uno o otro. Imaginemos que si para un proyecto se contratan 5 developers, y tres de ellos ya tienen varios proyectos hechos con C#, hacer que ellos trabajen en VB.Net disminuirá ligeramente su productividad?, otro tema son las librerías disponibles sobre las cuales vas a trabajar, sobre todo si quieres personalizar algunas de ellas, digamos que vas usar algún software factory, como el Web Service Software Factory que en un inicio esta disponible sólo en C#, incrementaría la productividad que el proyecto este desarrollado con C#, y los developers estén familiarizados con ese lenguaje, y cuando tengan que hacer algún cambio al código generado lo hagan más rápido?

Podríamos resumir, para escoger un lenguaje las siguientes pautas, ya que en el fondo con los dos podrías hacer lo mismo:

  • Escoger aquel con el cual los desarrolladores hacen más rápido el proyecto. Y esto va por la experiencia, y con cual se sienten a gusto.
  • Que sea igual al lenguaje de las librerías, frameworks o bloques de código, que se van a usar. Siempre y cuando se quiera personalizar las mismas.

Imagino que debe haber alguna más, pero no se me ocurren en este momento.

Y si yo tengo la oportunidad de escoger el lenguaje, yo escogería C#, por que desarrollo más rápido en el, y la mayoría de librerías que usado ha predominado C#, como los Flan Controls, Ajax Control Toolkit, y la versión anterior de Web Service Software Factory que en un inicio se liberó en C#.

Ya si la decisión no depende de mí, y el jefe de proyecto escoge VB.Net, es bajo su responsabilidad xD, y si el proyecto esta interesante por que no hacerlo?

¡No se pierdan el WebCast!, no vemos ahí.

Saludos,

Crossposting desde ...
posted by starrillo | 0 Comments
Filed Under: , ,

decodificando el ViewState... para verle hasta las venas

El tema de ViewState es tema muy triado, pero no he tenido la oportunidad de comentarlo y entenderlo bien así que voy a explicar algunos puntos relacionados al tema.

Para tratar de entender a detalle al ViewState pueden leer el siguiente artículo: TRULY Understanding ViewState, tal fue el ranking del post que un usuario hizo un pdf con todos los comentarios, clasificados y ordenados al estilo FAQ: TRULY Understanding ViewState, the comment index. Aunque supongo que ya lo leyeron, los que revisaron el LDLS-2008mar10.

Para entender el ViewState, veamos primero que pasaba antes de la existencia del mismo, y cual era el problema que en el ASP Clásico, y en general en el mundo Web con las demás tecnologías de servidor, debido a que las páginas web son stateless.

Cuando agregamos un nuevo WebForm a nuestro proyecto Web, agrega el siguiente código html:

   1: <body>
   2:     <form id="form1" runat="server">
   3:     <div>
   4:     
   5:     </div>
   6:     </form>
   7: </body>

Ahora vamos a cambiar el código de form, por el siguiente, para revisar el modelo de trabajo de un página con el clásico ASP:

   1: <form id="form1" method="post" action="WebForm01.aspx" >
   2:    <div>
   3:        <input id="txtNombre" name="txtNombre" type="text" />
   4:        <br />
   5:        <input id="btnEnviar" type="submit" value="enviar" />
   6:        <br />
   7:        <br />
   8:        <span><strong>Nombre: </strong>
   9:           < %= Request.Form["txtNombre"]%></span>
  10:    </div>
  11: </form>

En el caso del action, depende del nombre sobre el formulario que estén trabajando.

SI hacemos "View in Browser" a la página, ingresamos un nombre y hacemos un submit:

http://sergiot2.com/blogimages/2008/05May/02_name.jpg

Noten que el contenido del control txtNombre, se ha perdido. Este era el problema, la perdida de valores entre postbacks al servidor, y se usaban distintas técnicas para guardar el valor de los controles, como por ejemplo el uso de controles  Hidden. Veamos el código fuente de lo que se muestra en el navegador:

   1: <form id="form1" method="post" action="WebForm01.aspx" >
   2:    <div>
   3:        <input id="txtNombre" name="txtNombre" type="text" />
   4:        <br />
   5:        <input id="btnEnviar" type="submit" value="enviar" />
   6:  
   7:        <br />
   8:        <br />
   9:        <span><strong>Nombre: </strong>Ricardo</span>
  10:    </div>
  11: </form>

Recuerden que siempre al cliente llega todo como html, y nada de la tecnología de servidor usada. Para refrescar un poco:

http://sergiot2.com/blogimages/2008/05May/03_web.jpg

Sólo como recordatorio: El cliente ingresa a su navegador y pide una url, esta se envía por el método get al servidor, el servidor recibe el request, y lo procesa de acuerdo al tipo de recurso solicitado, en el caso de asp.net las compila, y genera el html para ser enviado al cliente que hizo el request, cuando llega el html al browser, este lo interpreta (si la diseño bien y respeto los estándares), y lo muestra finalmente al usuario. Esto es en el primer pedido, cuando el usuario no ha interactuado con el formulario.

En nuestro ejemplo si el usuario ingresa un nombre y hace un submit, el paso 1 se modifica y en el request también viaja el form