JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Renderizar HTML compatible con ASP.NET 3.x para los controles Web en ASP.NET 4.0

ASP.NET 4.0 ha cambiado la forma de renderizar los controles Web. Ahora, para representarlos en las páginas resultantes, genera HTML que cumple con los estándares de la W3C. En concreto los controles de ASP.NET 4.0 Web Forms generan XHTML 1.0 Strict. Viñeta por Gabriel Utasi Esto es fantástico para la mayor parte de los casos, ya que nos ayudará a que nuestras aplicaciones con ASP.NET Web Forms se adapten más fácilmente a los estándares y los requisitos de accesibilidad. Sin embargo puede darnos más de un dolor de cabeza en caso de que estemos reusando código CSS o Javascript que hayamos hecho con una versión anterior. También podría trastocarnos algunos maquetados de páginas hechos con versiones anteriores de la plataforma. Para poder volver al comportamiento anterior de ASP.NET 3.5 (en realidad 2.0) y poder elegir la forma de renderizar los controles y por tanto el tipo de HTML generado, los controles tienen una nueva propiedad llamada RenderingCompatibility. Sin embargo esta prop... [Más]

Cómo crear un temporizador global en ASP.NET

Las páginas Web son objetos con un tiempo de vida corto: se llaman, se ejecutan en el servidor, se devuelve el resultado y mueren. Por lo tanto no tiene sentido colocar en ellas un objeto como un temporizador (el típico Timer que sí tenemos en un formulario de Windows). La forma de atar un evento periódico a una página Web (por ejemplo para actualizar los contenidos de la misma) es siempre en en lado cliente, es decir, con JavaScript. Para facilitarnos la vida, las extensiones de ASP.NET AJAX incluyen un control Timer que podemos arrastrar sobre el formulario para forzar la actualización periódica de uno o más UpdatePanels que tengamos sobre el mismo. Sin embargo, en principio, no tenemos forma de conseguir un temporizador en el servidor que se ejecute cada cierto tiempo para todos los usuarios de nuestra aplicación. ¿O sí? Crear un temporizador para una aplicación Web Dentro de las clases base de la plataforma .NET, dentro del espacio de nombres System.Timers, existe una clase esp... [Más]

Mis dos libros de ASP.NET disponibles en PDF

Desde ayer están disponibles en la tienda on-line de Krasis mis dos libros de ASP.NET para compra también en PDF: Existen tres opciones a la hora de comprar cada libro: comprarlo en papel (como siempre), comprarlo en PDF o, para mi la mejor opción, comprarlo a la vez en papel y en PDF. En este último caso por sólo 5 euros (+IVA) más sobre el precio de papel podemos comprar el libro en PDF. Basta con seleccionar la opción que nos interese antes de darle al botón de añadir al carrito: El eterno dilema de la protección y el "pirateo" En krasis no creemos en sistemas como Adobe Digital Editions y similares que atan la compra a un dispositivo determinado y que coartan tu libertad de uso de lo que has comprado. No nos parece justo que compres un PDF y puedas leerlo solamente en el ordenador en el que lo has comprado y que tengas que usar un programa especial para leerlo. Queremos libertad para que el comprador haga un uso responsable de su compra. Por ello estos libros son PDFs que... [Más]

Modo de redirección de errores personalizados en ASP.NET y su impacto en SEO e imagen

Desde la configuración de una aplicación ASP.NET es posible configurar páginas de error propias, personalizadas, para que cuando una página falla estrepitosamente o hay un enlace roto no tengamos que ver la famosa YSOD de ASP.NET (Página Amarilla de la Muerte, Yellow page Of Death). Esto es una gran ventaja para los programadores de ASP.NET ya que nos evita tener que configurar manualmente IIS para conseguir el mismo resultado y basta con tocar el web.config para cambiar el modo en que se visualiza cualquier circunstancia anómala de una página. Para conseguirlo sólo hay que introducir en web.config el nodo <customErrors> de manera similar a esta: En este ejemplo hemos definido una página especial para el error con código de estado HTTP 404 (que significa "No encontrado"), otra para el estatus 500 ("Error interno del servidor", o sea, todos los errores no controlados), y una página (ErrorGenerico.aspx) para el resto de códigos de estado HTTP que no sean el 200 (que significa q... [Más]

Mayor control sobre aplicaciones ASP.NET para hosters en .NET 4.0

La mayoría de las empresas de hosting lo que pretenden es albergar cuantas más aplicaciones mejor en un mismo servidor. Eso significa más clientes dentro del mismo hardware y por lo tanto más ingresos. Para ello generan un único grupo de aplicaciones en el que se ejecutan todas las aplicaciones, lo que abre menos procesos simultánenos en el servidor y ahorra recursos. Como contrapartida las aplicaciones mal escritas pueden llegar a monopolizar los recursos del servidor y echar abajo a las demás. La dificultad de esta técnica de gestión estriba en averiguar qué aplicación es la que está desbocada cuando aparecen los problemas, ya que al estar todas bajo el mismo proceso no hay forma de distinguir unas de otras para poder parar a la conflictiva. Sabiendo que esto es práctica habitual, el equipo de ASP.NET ha introducido un nuevo ajuste en la configuración de ASP.NET 4.0 que permite distinguir los recursos utilizados por cada aplicación individualmente, aunque compartan el mismo proceso... [Más]

ASP.NET 4.0: Nueva sintaxis declarativa para evitar XSS

Los que ya tenemos una cierta edad y hemos trabajado (y mucho) con ASP Clásico estamos acostumbrados a ver la sintaxis <%= %> en las páginas Web. Este tipo de expresiones se limitan a mostrar lo que vaya dentro de ellas en el lugar indicado en la página. Por ejemplo, si escribimos: <%= Request.Url.ToString() %> Obtendremos la URL de la página actual. Se puede usar cualquier tipo de expresión dentro de estas etiquetas (llamadas a funciones, condicionales, bucles...) y veremos en la página el resultado. Este tipo de sintaxis siempre fue denostada por generar mucho código espagueti, el cual es típico de otros lenguajes como PHP. Está soportado por ASP.NET Web Forms, aunque prácticamente apenas se utiliza pues hay muchas opciones mejores. Sin embargo vuelve a estar más de moda que nunca debido a ASP.NET MVC. En MVC se utilizan mucho en las vistas ya que permiten mostrar de manera directa y sencilla los valores de las propiedades del modelo. Y la verdad es que convierte... [Más]

Creación de manejadores de peticiones asíncronos: El contador de Meneame.net

Meneame.net es una Web recopiladora de enlaces en la que los usuarios publican enlaces que creen de interés, y el resto de los usuarios votan o critican en función de lo sus intereses. La teoría es que, de este modo, los enlaces más interesantes subirán hacia las primeras posiciones de su categoría en virtud de este proceso de "crowdsourcing". La práctica es que no siempre es así (prueba a posicionar un enlace técnico, por ejemplo). Pero no obstante la web es muy interesante para encontrar enlaces y noticias de interés general dentro de temáticas más o menos prosaicas. A cada voto que recibe una URL se le denomina "meneo". El caso es que, al menos oficialmente, no existe ningún botón de información sobre cuántos "meneos" tiene una determinada URL, al estilo de los que tiene Facebook o Twitter. Los únicos desarrollos que integran este botón para poder poner dicha información en tu blog o web pertenecen a sitios de valoración social, estilo ShareIt y compañía, por lo que si quieres tene... [Más]

Solución al mensaje "Error genérico de GDI+" en aplicaciones Web que generan gráficos

Este fin de semana he estado trabajando en una pequeña aplicación que en breve colgaré con código fuente para todo el mundo y que me dio el error que os comento en el título del post. Aunque todo lo que utilicé era compatible con .NET 2.0, la desarrollé en mi equipo con Visual Studio 2010 y .NET 4.0, donde todo funcionaba a la perfección. Al subirla al servidor donde iba a estar albergada, de repente, me daba el error "Error genérico de GDI+" o -en inglés- "A generic error occurred in GDI+", sin más explicaciones, y con unas referencias muy raras a Remoting. Mi código original generaba una imagen que posteriormente se devolvía al navegador en formato PNG. El código que estaba utilizando era similar al siguiente: Bitmap img = new Bitmap(sRutaImagenPatron);Graphics g = Graphics.FromImage(img);Font f = new Font(fuente, tamanio, FontStyle.Bold);Brush b = colorLetra;g.DrawString(string.Format("{0:n0}", iDato), f, b, posX_Letra, posY_Letra); context.Response.ContentType = "image/png";img... [Más]

Archivos temporales de compilación de ASP.NET

Esta pregunta ha surgido hoy en uno de mis cursos de desarrollo Web y me ha parecido interesante para comentarla aquí. Como es sabido ASP.NET Web Forms hace uso de una serie de archivos de código auto-generados para “mezclar” su código con las clases “code-beside” que contienen los eventos y el código que escribimos para los formularios Web, por medio del uso de clases parciales y herencia. Nota: Por ejemplo, en la página Default.aspx, su archivo “code-beside” sería Default.aspx.cs o Default.aspx.vb en función de si programamos en C# o VB Este código se genera dinámicamente al compilar el sitio Web y, en teoría, se almacena para hacer caché en la carpeta: C:\Windows\Microsoft.NET\Framework\vx.y.zzzz\Temporary ASP.NET Files siendo x.y.zzzz la versión de la plataforma que tengamos instalada, que en caso de .NET 4.0 es “v4.0.30319” y en las demás versiones anteriores (2.0, 3.0 y 3.5) es “v2.0.50727” (ya he dicho muchas veces que las versiones 2.0, 3.0 y 3.5 son lo mismo a efectos... [Más]

Evitar que se publiquen las descripciones de nuestros servicios Web

Si disponemos de un servicio Web en nuestro servidor que está destinado a ser utilizado por nuestras aplicaciones pero no queremos facilitar que otros programadores le puedan sacar partido: ¿para qué queremos dejar publicado su archivo de descripción WSDL? El WSDL (Web Services Description Language) describe cómo es un servicio Web: qué tipos usa, qué métodos expone, etc… y es lo que usan Visual Studio y otras herramientas para crear un proxy que nos permita usar un determinado servicio. Se puede visualizar para cualquier servicio de .NET añadiendo ?wsdl al final de su URL, por ejemplo: http://www.miservidor.com/Servicios/miServicio.asmx?wsdl Cuando añadimos una nueva referencia Web a nuestro proyecto, en el diálogo que aparece podemos inspeccionar el servicio gracias a su descripción WSDL: Sin ese WSDL no podríamos inspeccionarlo ni tampoco añadir la clase proxy correspondiente. Un proxy es una serie de clases .NET que actúan de intermediarias entre nuestro código y el servi... [Más]