Open Flash Chart es un componente con licencia GPL que permite mostrar distintos tipos gráficos a partir de datos almacenados en archivos de texto plano o generados al vuelo con algún lenguaje del lado del servidor -- actualmente sólo existen librerías para Java, Perl, Python, Ruby and Rails y PHP:
Category: ASP.NET
Entradas relacionadas a ASP.NET
Me tomé la libertad de hacer una traducción libre (con algunos comentarios míos agregados) de "20 Tips to Improve ASP.net Application Performance":
- Deshabilitar el estado de sesión: Si no se usa, entonces es mejor desactivarlo puesto que aparte de consumir recursos del servidor, generalmente también lo hace en el tráfico HTTP entre servidor y cliente al propagar el ID de la sesión. Esta opción se puede desactivar a nivel de la aplicación (elemento
sessionState
delweb.config
) o para páginas individuales (propiedadEnableSessionState
). - Activa el buffer de la página: Para reducir la comunicación entre cliente y servidor es mejor enviar los contenidos en bloque.
When you run your ASP.NET application by using the ASP.NET process model, it is even more important to have buffering enabled. The ASP.NET worker process first sends responses to IIS in the form of response buffers. After the ISAPI filter is running, IIS receives the response buffers. These response buffers are 31 KB in size., After IIS receives the response buffers, it then sends that actual response back to the client. With buffering disabled, instead of using the entire 31-KB buffer, ASP.NET can only send a few characters to the buffer. This causes extra CPU processing in both ASP.NET as well as in IIS. This may also cause memory consumption in the IIS process to increase dramatically.
Evitar la validación en el lado del servidor: En el artículo original el autor recomienda realizar la validación sólo en el cliente (javascript), pero en mi opinión, esto es un error, puesto que depender solamente de javascript para este tipo de cosas es como no hacer nada.- Usar el control Repeater y evitar en lo posible el uso de los controles DataList, DataGrid y DataView: Los últimos no son recomendados porque generan mucho código HTML, pero en ASP.NET 2 esto se puede solventar usando los Control Adapters o usando otra forma para desarrollar aplicaciones ASP.NET.
- Usar
HttpResponse.IsClientConnected
: Verficar si el cliente todavía sigue conectado antes de realizar operaciones costosas.
Consider using the HttpResponse.IsClientConnected property to verify if the client is still connected before processing a request and performing expensive server-side operations. However, this call may need to go out of process on IIS 5.0 and can be very expensive. If you use it, measure whether it actually benefits your scenario.
- Usar
HTTPServerUtility.Transfer
en lugar deResponse.Redirect
: El último envía las cabeceras necesarias (Location
) al cliente y éste hace una nueva petición al servidor Web en base a esa cabecera. - Usar siempre
Page.IsValid
cuando se trabaja con los controles de validación: Esto principalmente se debe a lo que comentaba en el punto 3, la única forma de asegurar que los datos cumplen con las reglas de validación definidas en esos controles -- de validación --, es verificando el valor de esa propiedad. - Desplegar las aplicaciones en modo
Release
: Esto es para que se hagan las optimizaciones necesarias al momento de compilar la página y/o aplicación, además de otros
Leer el siguiente importantes aspectos. - Deshabilitar el seguimiento de página: No hay ninguna razón válida para que esta característica esté habilitada en una aplicación en producción.
Page.IsPostBack
es tu amigo: Hay acciones/código que puede evitarse cuando el cliente realiza una petición (envía la página a través del método POST).- Minimizar el número de excepciones: En una aplicación y escenario ideal no habrá este tipo de problemas, pero como nosotros siempre nos equivocamos por el mismo hecho de ser humanos, tenemos que tomar medidas necesarias para reducir al mínimo posible el número de excepciones que genera una aplicación. Una lectura recomendada al respecto.
- Usar la cache: Poner en cache aquellos datos que no cambian mucho. Por otro lado, usar el cache de salida para páginas o partes de páginas que no cambian frecuentemente.
- Usar/crear cache por petición: Usar
HttpContext.Items
para mantener los datos que se necesitan en las diferentes etapas del proceso que sigue una página ASP.NET antes de llegar al cliente. - Usar StringBuilder para operaciones intensivas con cadenas.
- Deshabilitar el ViewState: Toda la "magia" de los controles de servidor de ASP.NET dependen de esta característica: los datos se serializan en campos ocultos que se envían/reciben en cada petición. Así que si alguien quiere "venderles" ASP.NET con la idea de que hacer aplicaciones de escritorio es igual que hacer aplicaciones Web, ya saben cuáles son los inconvenientes.
- Usar paginación: Sólo recuperar los datos necesarios para la página que se visualiza, de preferencia esto se debe realizar desde la base de datos.
- Usar App_offline.htm para actualizar las aplicaciones.
Usar ControlState en lugar del ViewState para los controles: En el artículo original se recomienda el uso del control de estado, pero hasta donde sé, da lo mismo usar uno u otro, porque el control de estado también tiene los mismos inconvenientes que el ViewState con la única diferencia que éste no puede deshabilitarse.- Usar el bloque
finally
para asegurarse que todos los recursos son liberados adecuadamente, aunque también se puede usar la instrucción using para este caso. - Usar
Option Strict
yOption Explicit
, supongo que alguno que desarrolle en VB.NET puede justificar esta parte.
Si alguien está interesado en leer información más útil y específica para mejorar el rendimiento de las aplicaciones ASP.NET, puede darle una mirada a Improving ASP.NET Performance y Scalable Apps with Asynchronous Programming in ASP.NET.
Actualización (19/07/2007): Luis Ruiz Pavón comenta una forma más sencilla de unir documentos usando iTextDotNet.
Una pequeña clase que hace uso de iText# (Software Libre) para unir dos o más documentos PDF en uno solo.
using System.Collections.Generic;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
public class PdfMerge
{
private BaseFont baseFont;
private bool enablePagination = false;
private readonly List<PdfReader> documents;
private int totalPages;
public BaseFont BaseFont
{
get { return baseFont; }
set { baseFont = value; }
}
public bool EnablePagination
{
get { return enablePagination; }
set
{
enablePagination = value;
if (value && baseFont == null)
baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
}
}
public List<PdfReader> Documents
{
get { return documents; }
}
public void AddDocument(string filename)
{
documents.Add(new PdfReader(filename));
}
public void AddDocument(Stream pdfStream)
{
documents.Add(new PdfReader(pdfStream));
}
public void AddDocument(byte[] pdfContents)
{
documents.Add(new PdfReader(pdfContents));
}
public void AddDocument(PdfReader pdfDocument)
{
documents.Add(pdfDocument);
}
public void Merge(string outputFilename)
{
Merge(new FileStream(outputFilename, FileMode.Create));
}
public void Merge(Stream outputStream)
{
if (outputStream == null || !outputStream.CanWrite)
throw new Exception("OutputStream es nulo o no se puede escribir en éste.");
Document newDocument = null;
try
{
newDocument = new Document();
PdfWriter pdfWriter = PdfWriter.GetInstance(newDocument, outputStream);
newDocument.Open();
PdfContentByte pdfContentByte = pdfWriter.DirectContent;
if (EnablePagination)
documents.ForEach(delegate(PdfReader doc)
{
totalPages += doc.NumberOfPages;
});
int currentPage = 1;
foreach (PdfReader pdfReader in documents)
{
for (int page = 1; page <= pdfReader.NumberOfPages; page++)
{
newDocument.NewPage();
PdfImportedPage importedPage = pdfWriter.GetImportedPage(pdfReader, page);
pdfContentByte.AddTemplate(importedPage, 0, 0);
if (EnablePagination)
{
pdfContentByte.BeginText();
pdfContentByte.SetFontAndSize(baseFont, 9);
pdfContentByte.ShowTextAligned(PdfContentByte.ALIGN_CENTER,
string.Format("{0} de {1}", currentPage++, totalPages), 520, 5, 0);
pdfContentByte.EndText();
}
}
}
}
finally
{
outputStream.Flush();
if (newDocument != null)
newDocument.Close();
outputStream.Close();
}
}
public PdfMerge()
{
documents = new List<PdfReader>();
}
}
Si bien es cierto que hay muchas cosas por mejorar, creo que para escenarios no muy complejos basta y sobra.
Pueden descargar la solución creada en Visual Studio 2005 que -- incluye el ensamblado iText# y -- como ejemplo une dos papers bastante interesantes ("Composable Memory Transactions" y "Static Typing Where Posible, Dynamic Typing When Needed: The End of The Cold War Between Programming Languages").
Nota: La clase está basada en el artículo Merge PDF files with iText.
La boletín de seguridad de Microsoft para Julio, menciona tres problemas de seguridad en el .NET Framework, dos de éstos permiten la ejecución remota de código y el tercero permite descargar los contenidos de cualquier aplicación Web.
- .NET PE Loader Vulnerability: A remote code execution vulnerability exists in .NET Framework that could allow an attacker who successfully exploited this vulnerability to make changes to the system with the permissions of the logged-on user. If a user is logged in with administrative user rights, an attacker could take complete control of the affected system. An attacker could then install programs; view, change, or delete data; or create new accounts with full user rights. Users whose accounts are configured to have fewer user rights on the system could be less impacted than users who operate with administrative user rights.
- .NET JIT Compiler Vulnerability: A remote code execution vulnerability exists in .NET Framework Just In Time Compiler that could allow an attacker who successfully exploited this vulnerability to make changes to the system with the permissions of the logged-on user. If a user is logged on with administrative user rights, an attacker could take complete control of the affected system. An attacker could then install programs; view, change, or delete data; or create new accounts with full user rights. Users whose accounts are configured to have fewer user rights on the system could be less impacted than users who operate with administrative user rights.
- ASP.NET Null Byte Termination Vulnerability: An information disclosure vulnerability exists in .NET Framework that could allow an attacker who successfully exploited this vulnerability to bypass the security features of an ASP.NET Web site to download the contents of any Web page.
Videos sobre .NET
Presentaciones sobre .NET:
- CLR Garbage Collector: Interesante presentación de Justin Smith sobre el funcionamiento interno del Garbage Collector.
- .NET Windows Forms and Tricks: Ken Getz hace una serie de recomendaciones para el desarrollo aplicaciones de escritorio con .NET.
- Hibernating Rhinos - Episode #2 - Select * From MonoRail.Customers: Comparación entre MonoRail y los WebForms de ASP.NET.
- Hibernating Forums - Part I - Testable and Painless Persinstence.