Documentos de Académico
Documentos de Profesional
Documentos de Cultura
por ejemplo
<%mivariable=122%>
asp2.asp
<%dim mivariable
mivariable=122%>
asp1.asp
asp2.asp
<%
mivariable=request.form("mivariable")
%>
2.- Mediante una cadena de consulta a modo de link y capturando la información con
request.querystring
asp1.asp
<a href="asp2.asp?mivariable=hola">Paso de variables</a>
asp2.asp
<%
mivariable=request.querystring("mivariable")
%>
<%
urldelavisita=request.servervariables("HTTP_REFERER")
%>
Cuando recibimos textos desde un texarea de un formulario, para almacenarlo en una BD, nos encontramos con el
problema de que al mostrar luego este texto en una página HTML no se respetan los altos de línea introducidos
originalmente.
Para evitar esto, lo que podemos hacer es sustituir estos saltos de linea por caracteres "<br>" antes de introducirlos en la
base de datos mediante la funcion Replace
<%comentarios=replace(request.form("comentarios"),chr(10),"<br>")%>
1º En la página donde haces la comprobación del login de usuario, imaginate que la comprobación es ver si la
variable "acceso_permitido" tiene el valor True y que la página del login se llama login.asp y está en el directorio
raiz de la web. En la página escribiriamos (antes de la etiqueta <head>)
<%
Path_index=Request.ServerVariables("PATH_INFO")
If acceso_permitido<>True Then Response.redirect("/login.asp?Origen=" & Path_index)
%>
Origen=Request.Querystring("Origen")
'....
'Comprobamos los datos
'....
'Y si la contraseña es correcta (Login_ok=true)lo redireccionamos de vuelta a casa
If Login_ok=True Then
Response.redirect(Origen)
else
Response.redirect(/acceso_denegado.htm)
end if
La Función Split
Descripción
Sintaxis
Parte Descripción
expresión Requerido. Expresión de cadena que contiene las subcadenas y
delimitadores. Si expresión es una cadena de longitud cero, Split
devuelve una matriz vacía, es decir, una matriz sin elementos ni datos.
delimitador Opcional. Carácter de cadena que se usa para identificar los límites de
las subcadenas. Si se omite, se asume que el carácter delimitador es el
carácter de espacio (" "). Si delimitador es una cadena de longitud
cero, se devuelve una matriz de un solo elemento que contiene toda la
expresión.
Valores
Comentarios
Este articulo ha sido leído 12,047 veces
La función Ubound
Descripción
UBound(nombredematriz[, dimensión])
Parte Descripción
nombredematriz Requerido. nombre de la variable de matriz que cumple con el estándar de asignación de nombres de
variables.
dimensión Opcional. Número entero que indica para qué dimensión se va a devolver el límite superior. Use 1 para la
primera dimensión, 2 para la segunda y así sucesivamente. Si se omite dimensión, se asume que es igual a
1.
Comentarios
La función UBound se usa con la función LBound para determinar el tamaño de una matriz. Use la
función LBound para buscar el límite inferior de una dimensión de una matriz.
El límite inferior de cualquier dimensión siempre es igual a 0. Como resultado, UBound devuelve los
siguientes valores para una matriz con estas dimensiones:
Dim A(100,3,4)
Instrucción Valor devuelto
UBound(A, 1) 100
UBound(A, 2) 3
UBound(A, 3) 4
Sintaxis
FormatDateTime(Fecha[, FormatoConNombre])
Parte Descripción
FormatoConNombre Opcional. Valor numérico que indica el formato de fecha y hora usado. Si se omite, se usa vbGeneralDate.
Valores
vbGeneralDate 0 Muestra una fecha o una hora. Si hay una parte que sea fecha, la muestra con formato de fecha
corta. Si hay una parte que sea hora, la muestra con formato de hora largo. Si está presente, se
muestran ambas partes.
vbLongDate 1 Muestra una fecha con el formato de fecha larga especificado en la configuración regional del
equipo.
vbShortDate 2 Muestra una fecha con el formato de fecha corta especificado en la configuración regional del
equipo.
vbLongTime 3 Muestra una hora con el formato de hora especificado en la configuración regional del equipo.
El siguiente ejemplo usa la función FormatDateTime para dar formato de fecha larga a la expresión y asignarla a MiFechaHora:
Function ObtenerFechaActual
' FormatDateTime da formato a Date como fecha larga.
ObtenerFechaActual = FormatDateTime(Date, 1)
End Function
No existe ninguna sentecia en Vbscrip para vaciar un array, pero podemos hacerlo
usando usando las sentencias Redim y Ubound
ReDim miArray(UBound(miArray))
Esta sentencia reinicializa el array miArray
Este articulo ha sido leído 28,408 veces
Sugerencias sobre ASP para la mejora del rendimiento y el estilo (I)
Introducción
El rendimiento es una característica fundamental y, de hecho, si una aplicación no se diseña desde un principio teniéndolo en cuenta, más
adelante será preciso volver a desarrollarla. Dicho de esta manera uno se pregunta: ¿existe alguna estrategia eficaz para maximizar el rendimiento
de la aplicación ASP (Páginas Active Server)?
Este artículo proporciona una serie de sugerencias que permiten optimizar las aplicaciones ASP y Visual Basic® Scripting Edition (VBScript) y
en él se discuten las muchas trampas y dificultades a las que se ha tenido que hacer frente. Las sugerencias que se enumeran se han utilizado en
distintos sitios, incluyendo el de Microsoft, http://www.microsoft.com, y se ha comprobado que funcionan a la perfección. Este artículo da por
sentado que el lector conoce los aspectos básicos del desarrollo de ASP, incluidos VBScript y/o JScript, las aplicaciones y sesiones ASP y el
resto de objetos intrínsecos ASP (Request, Response y Server).
A menudo el rendimiento de ASP depende de mucho más que el propio código ASP. En lugar de cubrir todo el tema en un solo artículo, se han
enumerado al final del mismo los recursos relacionados con el rendimiento. Estos vínculos tratan sobre temas relacionados o no con ASP, por
ejemplo, Objetos de datos ActiveX® (ADO), Modelo de objetos componentes (COM), bases de datos y la configuración de Internet Information
Server (IIS). Se trata de algunos de nuestros vínculos preferidos y recomendamos que los visite.
Si no se puede garantizar que se van a cumplir dichos requisitos, los recordsets ADO no se deben almacenar en caché. En la sugerencias Evitar
almacenar en caché componentes no ágiles... y No almacenar en caché conexiones... que aparecen a continuación se discuten los principales
riesgos que supone el almacenamiento de objetos COM en el ámbito de aplicación o de sesión.
En esta circunstancia, los datos permanecen allí hasta que el desarrollador decide modificarlos con la programación, hasta que termina la sesión o
hasta que se reinicia la aplicación Web. ¿Qué ocurre si es necesario actualizar los datos? Para forzar manualmente una actualización de los datos
de la aplicación, se puede llamar a una página ASP a la que sólo tenga acceso el administrador para que actualice los datos. Otra alternativa es
actualizarlos automáticamente de forma periódica utilizando una función. El ejemplo siguiente almacena una marca de tiempo con los datos y los
actualiza después de un intervalo de tiempo concreto.
<%
' error no mostrado...
Const UPDATE_INTERVAL = 300 ' Actualizar intervalo, en segundos
Sugerencia 3: Almacenar en caché datos y HTML en los discos del servidor Web
Puede que en ocasiones el volumen de datos que se deben almacenar en la memoria caché sea demasiado elevado. No obstante, el término
“demasiado” constituye una apreciación, ya que depende de la cantidad de memoria que se desea utilizar, así como del número de elementos que
se quieren almacenar en caché y la frecuencia en la que dichos elementos se recuperan. En cualquier caso, si son demasiados los datos que se
deben guardar, tenga en cuenta que siempre podrá almacenarlos en archivos XML o de texto en los discos duros de los servidores Web. Puede
combinar el almacenamiento en discos y en memoria para crear una óptima estrategia de almacenamiento en caché para su sitio.
Hay que tener en cuenta que cuando se está analizando el rendimiento de una única página ASP, la recuperación de los datos del disco puede que
no resulte una operación más rápida que su recuperación desde la base de datos. Sin embargo, el almacenamiento en caché reduce la carga que
deben soportar la base de datos y la red. En condiciones de cargas mayores se mejorará considerablemente el rendimiento general. El
almacenamiento en caché puede ser muy útil cuando se desean almacenar los resultados de una consulta costosa, como es el caso de las tablas
múltiples, de procedimientos almacenados más complejos o de grandes conjuntos de resultados. Pero, como siempre, se deben comparar otros
esquemas.
ASP y COM proporcionan algunas herramientas que permiten construir esquemas de almacenamiento basados en discos. Las funciones Save() y
Open() del recordset ADO guardan y cargan los recordsets desde el disco. Se pueden utilizar ambos métodos para volver a escribir el código de
muestra de la anterior sugerencia, Almacenar en caché datos utilizados frecuentemente en el objeto de aplicación..., sustituyendo Save() por el
código que desarrolla el objeto Application.
Existen otros componentes que funcionan con archivos:
Scripting.FileSystemObject (en inglés), que permite crear, leer y escribir archivos.
MSXML, el analizador de Microsoft® XML que se incluye con Internet Explorer, que admite el almacenamiento y la carga de
documentos XML.
El objeto LookupTable (ejemplo, utilizado en MSN) supone una elección más que acertada para la carga de listas simples desde el
disco.
Por último, otra alternativa posible es el almacenamiento en caché de la presentación de los datos en un disco en lugar de los propios datos. El
HTML procesado previamente puede almacenarse en disco como un archivo de extensión .htm o .asp, archivos a los que los hipervínculos
pueden conducir directamente. Se puede automatizar el proceso de generación de HTML utilizando algunas de las herramientas del mercado
como XBuilder (en inglés) o las características para la publicación en Internet de Microsoft® SQL Server™. Otra opción es #incluir
miniprogramas de HTML en un archivo .asp. También se pueden leer los archivos HTML desde el disco utilizando FileSystemObject, o bien,
emplear XML para el procesamiento previo (en inglés).
Los componentes configurados (Microsoft Transaction Server (MTS)/biblioteca COM+ y aplicaciones/paquetes del servidor) no son ágiles a
menos que se consideren Neutral. Los componentes de subprocesamiento controlado, entre otros componentes no ágiles, ofrecen mejores
resultados en el ámbito de página (es decir, se crean y se destruyen en una sola página ASP).
En IIS 4.0, un componente marcado como ThreadingModel=Both se consideraba ágil. Esto ya no es suficiente en IIS 5.0. El componente no sólo
debe marcarse como Ambos, sino que debe agregar el FTM. El artículo sobre agilidad (en inglés) describe cómo hacer que los componentes de
C++ escritos con la biblioteca de plantillas activa (ATL) agreguen el FTM. Tenga en cuenta que si el componente almacena en caché los
punteros de la interfaz, también dichos punteros deben ser ágiles o deben almacenarse en la tabla de interfaz global COM (GIT). Si no se puede
volver a compilar un componente marcado como Ambos para agregar el FTM, se podrá marcar dicho componente como
ThreadingModel=Neutral. De forma alternativa, si no desea que IIS realice la comprobación de la agilidad (es decir, desea que los componentes
no ágiles se almacenen en el ámbito de aplicación o de sesión), puede establecer AspTrackThreadingModel como True en la metabase. Cambiar
AspTrackThreadingModel no es una operación muy recomendable.
IIS 5.0 enviará un mensaje de error si se intenta almacenar un componente no ágil creado con Server.CreateObject en el objeto Application. Se
puede solucionar el problema utilizando <object runat=server scope=application ...> en Global.asa, aunque no es recomendable, ya que conduce
al ordenamiento y serialización, como se explica a continuación.
¿Qué es lo que ocurre si se almacenan en caché componentes no ágiles? Un componente de este tipo almacenado en el objeto Session
“bloqueará” la sesión a un subproceso de trabajo ASP. ASP mantiene un conjunto de procesos de trabajo que se ocupan de las solicitudes.
Normalmente el primer subproceso de trabajo que estuviera libre se ocuparía de la nueva solicitud. Si se bloquea una sesión a un subproceso, la
solicitud debe esperar hasta que el subproceso asociado se encuentre disponible. A continuación presentamos una analogía que bien puede servir
para explicarlo: uno va al supermercado, selecciona varios tipos de artículos comestibles y abona el importe en la caja nº 3. Imagine que a partir
de ese momento, siempre que compre artículos en ese supermercado, debe abonarlos en la misma caja nº 3, aunque haya menos personas
esperando en otras cajas o algunas de ellas se encuentre vacía.
El almacenamiento de componentes no ágiles en el ámbito de aplicación tiene un efecto aún peor sobre el rendimiento. ASP debe crear un
subproceso espacial para ejecutarlos, lo que tiene dos consecuencias: todas las llamadas deben realizarse en serie y se deben ordenar en dicho
subproceso. El ordenamiento supone que los parámetros deben almacenarse en un área compartida de memoria; se realiza un costoso cambio de
contexto en el subproceso especial; se ejecuta el método del componente; se ordenan los resultados en el área compartida; y un cambio adicional
de contexto devuelve el control al subproceso original. La serialización implica que los métodos se ejecutan de uno en uno. No se puede dar la
circunstancia de que dos subprocesos de trabajo ASP ejecuten simultáneamente métodos en el componente compartido, ya que esto acabaría con
la concurrencia, especialmente en equipos con varios procesadores. Y aún peor, todos los componentes no ágiles en el ámbito de aplicación
comparten un subproceso (“Host STA”), de forma que los efectos de la serialización son aún más marcados.
¿Resulta demasiado confuso? Aquí tiene algunas reglas generales. Si está desarrollando objetos en Visual Basic (6.0) o posterior, no debe
almacenarlos en caché en los objetos Application o Session. Si desconoce el modelo de subprocesamiento de un objeto, es mejor que no lo
almacene. En lugar de almacenar objetos no ágiles debe crearlos y liberarlos en cada página. Los objetos se ejecutarán directamente en el
subproceso de trabajo, con lo que no se producirán ni la serialización ni la ordenación. El rendimiento será el adecuado si los objetos COM se
ejecutan en un cuadro de IIS y si no tardan demasiado en iniciarse y destruirse. Tenga en cuenta que los objetos de subprocesamiento único no
deben utilizarse de este modo. Preste atención: ¡VB puede crear objetos de subprocesamiento único! Si debe utilizar objetos de subprocesamiento
único de esta manera (como una hoja de cálculo de Microsoft Excel), no espere un buen rendimiento.
Los recordsets ADO pueden almacenarse en caché de forma segura cuando ADO se marca como de subprocesamiento libre. Para marcar ADO
como de subprocesamiento libre, utilice el archivo Makfre15.bat, que se ubica normalmente en el directorio \\Archivos de programa\Archivos
comunes\System\ADO.
Advertencia: ADO no debe marcarse como de subprocesamiento libre si no se utiliza Microsoft Access como base de datos. El recordset ADO
siempre debe estar desconectado. Por regla general, si no se puede controlar la configuración de ADO del sitio (por ejemplo, el caso de los
fabricantes independientes de software [ISV], que distribuyen aplicaciones Web a los clientes y éstos de ocupan de sus propias configuraciones),
probablemente sea mejor que no almacene en caché los recordsets.
Los componentes de diccionario también se incluyen en la categoría de objetos ágiles. El objeto LookupTable carga sus datos desde el archivo de
datos y resulta muy útil para los datos de cuadros combinados y como información de configuración. PageCache de Duwamish Books (en
inglés) proporciona la semántica del diccionario, al igual que el diccionario Caprock. Estos objetos, o derivados, pueden formar la base de una
eficaz estrategia de almacenamiento. Tenga en cuenta que el objeto Scripting.Dictionary NO es ágil y que no debe almacenarse en el ámbito de
aplicación o de sesión.
Los objetos COM también tienen sus inconvenientes, incluyendo el tiempo de desarrollo inicial y la necesidad de nuevas habilidades de
programación. Encapsular pequeñas cantidades de ASP puede ir en detrimento del rendimiento en lugar de mejorarlo. Esto ocurre normalmente
cuando una pequeña cantidad de código ASP se incluye en el objeto COM. En este caso, la carga que supone crear e invocar el objeto COM
supera a las ventajas de utilizar código compilado. Se trata de una cuestión de ensayo y error el determinar qué combinación de secuencia ASP y
código de objetos COM genera el mejor resultado en cuanto a rendimiento. Microsoft ha mejorado enormemente el rendimiento de las
secuencias y de ADO en Windows 2000/IIS 5.0 en comparación con Windows NT® 4.0/IIS 4.0. De esta forma, la ventaja del rendimiento que se
disfrutaba al utilizar el código compilado sobre el código ASP se ha reducido con la introducción de IIS 5.0.
Para conocer algunos interesantes debates sobre las ventajas e inconvenientes de utilizar objetos COM en ASP, consulte Guía del componente
ASP y Programming Distributed Applications with COM and Microsoft Visual Basic 6.0 (en inglés). Si desea distribuir los componentes COM,
es importante que realice una prueba de carga (en inglés) de los mismos. De hecho, se deberían realizar por norma pruebas de este tipo en todas
las aplicaciones ASP.
Opciones de ASP
Las aplicaciones ASP pueden configurarse de forma que se ejecuten de tres formas distintas. Con IIS 5.0, el “nivel de aislamiento” de la
terminología se ha introducido para describir dichas opciones. Los tres valores del nivel de aislamiento son bajo, medio y alto:
Aislamiento bajo. Se admite en todas las versiones de IIS y se trata del método más rápido. Ejecuta ASP en Inetinfo.exe, el proceso
primario de IIS. Si se produjera un error en la aplicación ASP, éste se trasladaría a IIS. (Para reiniciar IIS en la versión 4.0, los
Webmasters deberían supervisar el sitio empleando herramientas como InetMon y lanzar archivos por lotes para reiniciar el servidor en
caso de error. IIS 5.0 introduce el proceso de reinicio confiable (en inglés), que permite reiniciar automáticamente un servidor en el que
se ha producido un error).
Aislamiento medio. IIS 5.0 introduce este nuevo nivel, que se denomina como fuera de proceso, ya que ASP se ejecuta fuera de
proceso de IIS. En el aislamiento medio, todas las aplicaciones ASP configuradas para ejecutarse como medias comparten un único
espacio de proceso. Esto reduce el número de procesos que son necesarios que ejecutar varias aplicaciones ASP fuera de proceso en un
cuadro. Medio corresponde al nivel de aislamiento predeterminado en IIS 5.0.
Aislamiento alto. Admitido en IIS 4.0 e IIS 5.0, el aislamiento alto también está fuera de proceso. Si se produjera un error en ASP, el
servidor Web no se vería afectado. La aplicación ASP se reiniciaría automáticamente en la siguiente solicitud ASP. Con el aislamiento
alto, cada aplicación ASP configurada para ejecutarse como alta lo hace en su propio espacio de proceso. De esta forma se protegen las
aplicaciones ASP unas de otras. El principal problema que presenta este sistema es que requiere un proceso independiente para cada
aplicación ASP. También puede suponer un incremento en la carga que se debe soportar cuando se deben albergar docenas de
aplicaciones en un cuadro.
Entonces, ¿cuál es la opción más adecuada? En IIS 4.0 se podía observar un declive en el rendimiento cuando la aplicación se ejecutaba fuera de
proceso. Se ha trabajado a conciencia en este tema en IIS 5.0 y se ha logrado minimizar el coste de la ejecución de las aplicaciones ASP fuera de
proceso. De hecho, en la mayoría de las comprobaciones, las aplicaciones ASP fuera de proceso en IIS 5.0 se ejecutan más rápidamente que las
aplicaciones en proceso en IIS 4.0. No obstante, las aplicaciones en proceso generan (con un nivel de aislamiento bajo) el mejor rendimiento en
ambas plataformas. A pesar de esta circunstancia, resulta difícil obtener beneficios del nivel bajo si la frecuencia de aciertos o la salida máxima
son relativamente bajas. Por tanto, es mejor no alcanzar el nivel de aislamiento bajo hasta que se necesiten cientos o miles de páginas por
segundo y por servidor Web. Como siempre, se deben comprobar las distintas configuraciones para determinar las compensaciones se que desean
obtener.
Nota: cuando se ejecutan aplicaciones ASP fuera de proceso (con aislamiento medio o alto), se ejecutan en MTS en NT4 y en COM+ en
Windows 2000. Es decir, en NT4 se ejecutan desde Mtx.exe y, en Windows 2000, por su parte, lo hacen en DllHost.exe. Se pueden ver los
procesos en el Administrador de tareas. También se pueden conocer los detalles de la configuración de los paquetes MTS o de las aplicaciones
COM+ por parte de IIS para aplicaciones ASP fuera de proceso.
Opciones de COM
Los componentes COM también presentan tres opciones de configuración que, sin embargo, no son completamente análogas a las de ASP. Los
componentes COM pueden estar: “no configurados”, configurados como aplicaciones de biblioteca o configurados como aplicaciones de
servidor. No configurado significa que el componente no se ha registrado con COM+ y que se ejecutará en el espacio de proceso de quien realizó
la llamada, es decir, se encuentran “en proceso”. Las aplicaciones de biblioteca también se encuentran en proceso, sin embargo se benefician de
los servicios de COM+, incluyendo la seguridad, las transacciones y el soporte del contexto. Las aplicaciones de servidor se configuran para
ejecutarse en su propio espacio de proceso.
Puede que vea unos beneficios importantes en el uso de componentes no configurados comparados con las aplicaciones de biblioteca, lo que sí
está claro es que verá unos beneficios mucho mayores en cuanto al rendimiento si utiliza estas últimas en lugar de las aplicaciones de servidor.
Esto se debe a que las aplicaciones de biblioteca se ejecutan en el mismo proceso que ASP, mientras que las del servidor lo hacen en su propio
espacio de proceso. Las llamadas de inter-proceso resultan mucho más costosas que las llamadas en proceso. Asimismo, cuando se pasan datos,
por ejemplo, recordsets, entre procesos, todos ellos se deben copiar entre los dos procesos.
¡He aquí un problema! Cuando se utilizan aplicaciones de servidor COM, si se pasan objetos entre ASP y COM, es preciso asegurarse de que
dichos objetos implementan el denominado “subprocesamiento por valor” o MBV, ya que los que lo hacen se copian a sí mismos de un proceso a
otro. Esto resulta mucho mejor que la otra alternativa, que consistiría en que el objeto debe permanecer en el proceso del creador y que el resto de
los procesos llamarían repetidamente al proceso que se está creando para que utilice el objeto. Los recordsets ADO desconectados se
subprocesarán por valor; los conectados no. Scripting.Dictionary no implementa MBV y no debería pasarse entre procesos. Por último,
enviamos un mensaje a los programadores de VB: MBV NO se obtiene pasando el parámetro ByVal. El autor del componente original
implementaría MBV.
Si tuviéramos que recomendar una configuración con una compensación razonable en cuanto a rendimiento y confiabilidad, sería la siguiente:
En IIS 4.0, utilizar el nivel de aislamiento bajo de ASP y los paquetes de servidor de MTS.
En IIS 5.0, utilizar el nivel de aislamiento medio de ASP y aplicaciones de biblioteca de COM+.
Estas son únicamente unas líneas generales; las empresas dedicadas a ello generalmente ejecutan ASP con un nivel de aislamiento medio o alto,
mientras que los servidores Web de un único propósito pueden ejecutarse con un aislamiento bajo. Analice las compensaciones y decida la
configuración que se ajusta en mayor medida a sus necesidades.
Como se puede ver, se trata de un sistema terriblemente ineficaz (y lento). La forma rápida de escribir el código en VBScript es:
Set myobj = Foo.bar.blah ' resolver blah UNA VEZ
Myobj.baz = myobj.qaz(1)
If Myobj.zaq = Myobj.abc Then '...
Si se utiliza VBScript 5.0 o posterior, se puede escribir utilizando la instrucción With:
With Foo.bar.blah
.baz = .qaz(1)
If .zaq = .abc Then '...
...
End With
Tenga en cuenta que esta sugerencia también se puede aplicar a la programación en VB.
Response.Flush
Uno de los problemas que se plantean con el búfer de respuesta es los usuarios perciben que la respuesta que obtienen de las páginas ASP es
menor (aunque el tiempo global de respuesta se haya mejorado) ya que deben esperar a que se genere toda la página antes de poder ver algo. En
el caso de las páginas que tardan en cargarse, se puede activar el búfer de respuesta con Response.Buffer = False. Sin embargo, una estrategia
mucho más eficaz sería utilizar el método Response.Flush, que descarga todo el HTML de ASP en el explorador. Por ejemplo, después de que
aparezcan 100 filas de una tabla de 1.000, ASP puede llamar a Response.Flush para que fuerce los resultados y que éstos aparezcan en el
explorador; de esta forma el usuario puede ver las primeras 100 filas antes de que las restantes estén listas. Esta técnica puede proporcionar
además lo mejor de ambos métodos: el búfer de respuesta combinado con la presentación gradual de los datos en el explorador.
(Es importante señalar que en el ejemplo anterior de una tabla de 1.000 filas, muchos exploradores no empezarán a cargar la tabla hasta que vean
la etiqueta de cierre </table>. Compruebe los exploradores para obtener información sobre compatibilidad. Para solucionar este problema, intente
dividir la tabla en varias más pequeñas con menos filas cada una de ellas y llame a Response.Flush después de cada tabla. Las últimas versiones
de Internet Explorer mostrarán las tablas antes de descargarlas completamente y lo harán a una velocidad considerable especialmente si se
especifica la anchura de columna previamente; con esto, Internet Explorer se evita tener que calcular la anchura de la columna en función del
contenido de cada celda).
Otro de los problemas más comunes que presenta el búfer de respuesta es que puede utilizar gran parte de la memoria del servidor cuando genera
páginas muy extensas. Dejando a un lado la cuestión de si es recomendable o no generar páginas extensas, también se puede hacer frente a este
problema utilizando Response.Flush.
Sugerencia 17: Crear una instancia de los objetos utilizando la etiqueta <OBJECT>
Si precisa hacer referencia a los objetos que puede que no se utilicen en todas las rutas del código (especialmente en los objetos del ámbito de
servidor o de aplicación), puede declararlos utilizando la etiqueta <object runat=server id=objname> en Global.asa en lugar del método
Server.CreateObject. Dicho método Server.CreateObject crea el objeto inmediatamente. Si más tarde no vuelve a utilizarlo, acabará malgastando
los recursos. La etiqueta <object id=objname> declara objname, pero en realidad objname no se crea hasta que se utilizan por primera vez uno de
sus métodos o propiedades.
Se trata de otro ejemplo de evaluación perezosa.
Debido al hincapié que se ha hecho en la creación de HTML “independiente del explorador”, esta cuestión a menudo ha servido para animar al
desarrollador a no utilizar las características más comunes del explorador que pudieran incidir positivamente en el rendimiento. En aquellos sitios
en los que el alto rendimiento depende en gran medida del “alcance” del explorador, una buena estrategia es optimizar las páginas para los
exploradores más utilizados, con lo que ASP podría detectar fácilmente sus características con el componente de capacidades del explorador.
Herramientas como Microsoft FrontPage pueden ayudarle a diseñar un código que funcione con los exploradores y con las versiones de HTML
que tiene como objetivo. Consulte When is Better Worse? Weighing the Technology Trade-Offs (en inglés) para obtener información adicional.
Tenga en cuenta que con el almacenamiento en el explorador y el servidor proxy se obtendrán menos registros en el servidor Web. Si lo que
desea es contar con un análisis detallado y preciso de todas las vistas de las páginas, por ejemplo, puede que el almacenamiento de este tipo no
proporcione los resultados deseados.
El almacenamiento en el explorador se controla por medio del encabezado HTTP “Expires”, que el servidor Web envía al explorador. ASP
proporciona dos simples mecanismos que permiten enviar este encabezado. Para que una página caduque tras un número específico de minutos
en el futuro, establezca la propiedad Response.Expires. El ejemplo siguiente indica al explorador que el contenido caducará a los 10 minutos:
<% Response.Expires = 10 %>
Establecer Response.Expires en un valor negativo o en 0 deshabilitará el almacenamiento en caché. Asegúrese de que utiliza números negativos
altos, como -1.000 (un poco más de un día), para solucionar las discrepancias entre los relojes del servidor y los exploradores. Una segunda
propiedad, Response.ExpiresAbsolute, permite establecer el intervalo de tiempo después del cual caducará el contenido:
<% Response.ExpiresAbsolute = #May 31,2001 13:30:15# %>
En lugar de utilizar el objeto Response para establecer el momento en el que caducará la página, se puede escribir una etiqueta <META> en el
código HTML, generalmente incluida en la sección <HEAD> del archivo HTML. Algunos exploradores respetarán esta directriz, pero no los
servidores proxy.
<META HTTP-EQUIV="Expires" VALUE="May 31,2001 13:30:15">
Por último, se puede indicar si el contenido es válido para que lo almacene en caché un servidor proxy, utilizando la propiedad
Response.CacheControl. Si se establece como “Public”, se habilitarán los servidores proxy, que almacenarán en caché dicho contenido.
<% Response.CacheControl = "Public" %>
De forma predeterminada, esta propiedad se establece como “Private”. Tenga en cuenta que no se debe habilitar el almacenamiento en caché en
el servidor proxy en el caso de las páginas que muestran datos específicos de un usuario, ya que el servidor proxy podría proporcionar dichas
páginas a otros.
Sugerencia 22: Utilizar Server.Transfer en lugar de Response.Redirect siempre que sea posible
Response.Redirect indica al explorador que debe solicitar otra página. Esta función se utiliza a menudo para redireccionar al usuario a una página
de registro o de error. Debido a que el redireccionamiento fuerza una nueva solicitud de página, el resultado es que el explorador debe visitar dos
veces el servidor Web y que éste debe administrar una solicitud adicional. IIS 5.0 introduce una nueva función, Server.Transfer, que transfiere la
ejecución a otra página ASP en el mismo servidor. De esta forma se evita que el explorador busque una segunda vez en el servidor Web, con el
resultado de una mejora en el rendimiento general del sistema, así como un mejor tiempo de respuesta para el usuario. Consulte New Directions
in Redirection (en inglés), donde podrá encontrar detalles sobre Server.Transfer y Server.Execute.
Asimismo recomendamos que consulte Leveraging ASP in IIS 5.0 (en inglés) para obtener la lista completa de nuevas características de IIS 5.0 y
ASP 3.0.
Recursos
Ajuste de IIS
The Art and Science of Web Server Tuning with Internet Information Services 5.0 (en inglés)
Leveraging ASP in IIS 5.0 por J.D. Meier (en inglés)
Tuning IIS 4.0 for High Volume Sites por Michael Stephenson (en inglés)
Tuning Internet Information Server Performance por Mike Moore (en inglés)
Navigating the Maze of Settings for Web Server Performance Optimization por Todd Wanke (en inglés)
Managing Internet Information Server 4.0 for Performance por Hans Hugli (en inglés)
Top Ten Tips: Accessing SQL Through ADO and ASP por J.D. Meier (en inglés)
Improve the Performance of your MDAC Application por Suresh Kannan (en inglés)
Pooling in the Microsoft Data Access Components por Leland Ahlbeck y Don Willits (en inglés)
SQL Server: Guías y pruebas comparativas sobre el rendimiento (en inglés)
Improving the Performance of Data Access Components with IIS 4.0 por Leland Ahlbeck (en inglés)
Microsoft Data Access Components (MDAC) and ActiveX Data Objects (ADO) Performance Tips por Leland Ahlbeck (en inglés)
Microsoft SQL Server 7.0 Practical Performance Tuning and Optimization - The Server Perspective por Damien Lindauer (en inglés)
Microsoft SQL Server 7.0 Practical Performance Tuning and Optimization - The Application Perspective por Damien Lindauer (en
inglés)
Accessing Recordsets over the Internet por Dino Esposito (en inglés)
Componentes de diccionario
Estado de la sesión
Rendimiento y escalabilidad
Guía para la creación de sitios Web con la plataforma Microsoft Windows DNA
Server Performance and Scalability Killers por George Reilly (en inglés)
Microsoft Visual Studio Scalability Center (en inglés)
Fitch & Mather Stocks 2000 (en inglés)
Tuning the FMStocks Application (en inglés)
High-Performance Visual Basic Apps por Ken Spencer (en inglés)
Duwamish Books, Phase 4 (en inglés)
Errores más importantes en el rendimiento de Windows DNA y cómo evitarlos por Gary Geiger y Jon Pulsipher
Building from Static HTML to High-Performance Web-Farms por Shawn Bice (en inglés)
Herramientas
Literatura
Professional Active Server Pages 3.0, Wrox Press. (Especialmente el capítulo 26 sobre la optimización del rendimiento de ASP, George
Reilly y Matthew Gibbs) (en inglés).
Guía de recursos de Microsoft Internet Information Services 5.0 (con Windows 2000 Server Resource Kit), Microsoft Press (en inglés).
Microsoft Internet Information Server Resource Kit (para IIS 4.0), Microsoft Press (en inglés).
Programming Distributed Applications with COM and Microsoft Visual Basic 6.0, Ted Pattison, Microsoft Press (en inglés).
Effective COM, Don Box, Keith Brown, Tim Ewald y Chris Sells; Addison-Wesley (en inglés).
Developing Web Usability: The Practice of Simplicity, Jakob Nielsen, New Riders (en inglés).
Estilo ASP
XML
Para evitar que una página se cargue desde el cache del navegador cliente en vez de volver a ejecutarse en el
servidor, solo tenemos que incluir como PRIMERAS instrucciones de nuestra página :
<%
Response.addHeader "pragma", "no-cache"
Response.CacheControl = "Private"
Response.Expires = 0
%>