Cuando se analiza el contenido del objeto Request, una de las colecciones a estudiar es la colección ServerVariables. Este conjunto contiene una combinación del valor en el encabezado HTTP enviado desde el cliente al servidor con la solicitud de página y el valor proporcionado por el propio servidor cuando recibe la solicitud.
El valor devuelto por
la página "autorreferencial"
de la colección ServerVariables contiene los detalles del servidor web y la información de la ruta de la página actual.Esta información se puede utilizar en cualquier lugar donde se cree una página. Por ejemplo, para crear una página de "autoreferencia" que pueda llamarse a sí misma nuevamente para completar otra tarea, podemos usar el siguiente código:
<FORM ACTION="<% = Request.ServerVariables("PATH_INFO") %>" METHOD= "POST ”>
Se puede obtener el mismo efecto con el valor HTTP “SCRIPT_NAME”:
<FORM ACTION="<% = Request.ServerVariables(“SCRIPT_NAME”) %>” METHOD="POST”>
Utilice el elemento <A> para abre una página diferente, puedes usar:
...
<%
strFullPath = Solicitud.ServerVariables("PATH_INFO")
'Quita el nombre del archivo
strPathOnly = Izquierda(strFullPath, InStrRev(strFullPath, “/”))
strNextPage = strPathOnly & “páginas/página_siguiente.asp”
%>
...
<A HREF=”<% = strNextPage %>”>Página siguiente</A>
...
estos ejemplos funcionan incluso si el nombre o la ubicación de la página original cambia, porque se utiliza la información de ruta de la página actual (por supuesto, el segundo ejemplo falla cuando cambia el nombre de la página de destino separada).
En otras palabras, si la URL se crea automáticamente para la subsesión del motor de búsqueda, se pueden recopilar algunos valores de ServerVariable:
strFullURL = http:// & Request.ServerVariables("LOCAL_ADDR") _
& ":" & Solicitud.ServerVariables("SERVER_PORT") _
& Request.ServerVariables("PATH_INFO")
Esto creará una URL completa que incluye el número de puerto (en este caso, no el valor estándar de 80). Por ejemplo, el resultado podría ser:
http://194.74.60.254:1768/thispath/thispage.asp
Detectando la versión del navegador
Otro valor útil en la colección ServerVariables es la cadena del agente de usuario del navegador del usuario. En la página "Detección del tipo de navegador" (browsertype.asp), el valor "HTTP_USER_AGENT" de la colección ServerVariables se utiliza para obtener la cadena del agente de usuario. Se utilizan algunos scripts para analizar esta información y encontrar el nombre del fabricante y la versión del navegador.
<%
strUA = Solicitud.ServerVariables("HTTP_USER_AGENT")
Respuesta.Escriba “La cadena del agente de usuario es <B>” & strUA & “</B>
"
Si InStr(strUA, “MSIE”) Entonces
Respuesta.Escriba “Para actualizar su navegador, vaya a “_
& “<A HREF=" & Chr(34) & http://www.microsoft.com/ie/ ”_
& Chr(34) & “> http://www.microsoft.com/ie/ <A>
"
intVersion = Cint(Mid(strUA, InStr(strUA, “MSIE”) + 5, 1))
Si intVersion >=4 Entonces
Response.Escribe "Puedes usar Microsoft Dynamic HTML"
Terminar si
Demás
Si InStr(strUA, “Mozilla”) Entonces
Si InStr(strUA, “compatible;”) = 0 Entonces
Respuesta.Escribe “Probablemente tu navegador sea Navigator. Puedes “_.
& “descargar la última versión de Navigator desde “_
& “<A HREF=" & Chr(34) & http://home.netscape.com/ ”_
& “descargar/”& Chr(34) & “> http://home.netscape.com ”_
& “/descargar/</A>
"
intVersion = Cint(Mid(strUA, InStr(strUA, “/”) +1, 1))
Si intVersion >= 4 Entonces
Response.Write "Probablemente puedas usar HTML dinámico de Netscape"
Terminar si
Demás
strVersion = Mid(strUA, InStr(strUA, “compatible;”) + 12)
strProduct = Left(strVersion, InStr(strVersion, “ “))
Respuesta.Escriba “Su navegador es compatible con Navigator. Usted puede”_.
& “buscar el fabricante mediante un motor de búsqueda, como”_
& “<A HREF=" & Chr(34) _
& “http://www.altavista.digital.com/cgi-bin/query?q=”_
&strProduct_
& Chr(34) & “> http://www.altavista.com/ </A>
"
Terminar si
Terminar si
Terminar si
%>
Los resultados de búsqueda para IE 5.0 y Navigator 4.61 son diferentes respectivamente. Para navegadores de otros fabricantes, puede obtener un enlace para comenzar a buscar automáticamente el nombre del fabricante en el sitio web de Alta Vista.
Tenga en cuenta que Netscape no proporciona el nombre del fabricante en la cadena del agente de usuario, por lo que no hay garantía absoluta de que un navegador sea Navigator.
Detección del idioma del navegador
Otro valor útil en la colección ServerVariables es "HTTP_ACCEPT_LANGUAGE", que contiene un código de idioma que se especifica cuando se instala el navegador o está codificado en la versión regional del usuario. Ejemplos de códigos de idioma son en-us (Reino Unido, EE. UU.), de-at (Alemania, Australia) y es-pe (España, Perú).
Los códigos de idioma pueden ser genéricos y omitir identificadores de dialecto: por ejemplo, en nuestro sitio Wrox, una gran cantidad de visitantes utilizan en (inglés) como código de idioma.
Por lo tanto, se puede detectar el código de idioma y cargar automáticamente una versión apropiada de la página, específica de la región o del idioma.
StrLocale = Lcase(Left(Request.ServerVariables("HTTP_ACCEPT_LANGUAGE"),2))
Seleccione Case strLocale
Caso “en”: Response.Redirect “http://uk_site.co.uk/”
Caso “de”: Respuesta.Redirect “http://de_site.co.de/”
Caso “fr”: Respuesta.Redirect “http://fr_site.co.fr/”
'...etc
Otro caso: Response.Redirect “http://us_sitel.com/”
Fin Seleccione
o redirija la página según un dialecto específico:
strLocale = Lcase(Request.ServerVariables("HTTP_ACCEPT_LANGUAGE"))
Seleccione Case strLocale
Caso “en-gb”: Response.Redirect “http://uk_site.co.uk/”
Caso “en-us”: Response.Redirect “http://us_site.com/”
Caso “es-pe”: Respuesta.Redirect “http://es_site2.co.pe/”
'...
Otro caso: Response.Redirect “http://us_site1.com/”
End Select
Otros valores útiles de la colección ServerVariables
pueden acceder y utilizar cualquier miembro de la colección ServerVariables para controlar la forma en que la página ASP responde a una solicitud. Puede comprobar si un visitante accedió al sitio utilizando el puerto predeterminado 80 u otro. En este ejemplo, busque el acceso a través del puerto 443, que proporciona acceso a Secure Socket Layer (SSI) (y otros protocolos), y rediríjalos a una página adecuada.
Si Request.ServerVariables("SERVER_PORT") = "443") Entonces
Response.Redirect "/securesite/default.asp" 'Usuario seguro
Demás
Response.Redirect “/normalsite/default.asp” 'Usuario no seguro
Fin Si
se requiere que el navegador se registre y sea verificado por el servidor (en lugar de permitirles acceder de forma anónima bajo la cuenta IUSER del servidor web, este tema se discutirá en detalle en un capítulo posterior), el nombre de usuario puede ser consultado para determinar el usuario que está tratando con nosotros. Quién es y si cargar la página para este usuario. Por ejemplo, el siguiente código solo mostrará el enlace de administración a los usuarios llamados Administrador.
...
<A HREF=”dispcnfg.asp”>Cambiar configuración de pantalla</A>
<A HREF=”dispcolr.asp”>Cambiar colores de pantalla</A>
<A HREF=”keyboard.asp”>Cambiar configuración de teclado</A >
<%
Si Solicitud.ServerVariables("AUTH_USER") _
= Ucase(Request.ServerVariables(“SERVER_NAME”)) & “Administrador” Entonces
%>
<A HREF=”allusers.asp”>Administrar todos los usuarios</A>
<A HREF=”usrlogon.asp”>Administrar información de inicio de sesión</A>
<%
Terminar si
%>
...
tenga en cuenta que ASP no completa la colección ServerVariables hasta que accede a uno de sus miembros. Acceder a un miembro de esta colección por primera vez hará que IIS lo obtenga todo; la colección ServerVariables solo debe usarse cuando sea necesario.
Otras técnicas de solicitud y respuesta
Ahora, veamos algunas técnicas útiles para usar los objetos de solicitud y respuesta, que incluyen:
· Gestión de conexiones, almacenamiento en búfer y redirecciones de páginas.
· Operación de encabezados HTTP, almacenamiento en caché y páginas de "expiración".
· Utilizar certificados de cliente.
· Crea mensajes de archivos de registro personalizados.
1. Gestión de conexiones, almacenamiento en búfer y redirecciones de páginas.
Una característica muy útil de ASP es permitir a los usuarios redirigir desde una página web ASP a otra página web (ASP o HTML), o a otro archivo fuente (como un archivo ZIP o texto). archivo) ). Esto es transparente para el usuario; en realidad es el navegador el que hace el trabajo. Cuando se utiliza el método Response.Redirect para cargar una nueva página web, en realidad se envía un encabezado HTTP especial al cliente. Este encabezado es:
HTTP/1.1 302 Objeto movido
Ubicación /newpath/newpage.asp
El navegador lee esta información de encabezado y carga la página según lo indicado por el valor de Ubicación. Funcionalmente, esto es lo mismo que usar la etiqueta HTML <META> del lado del cliente en una página web, por ejemplo:
<META HTTP-EQUIV="REFRESH" CONTENT="0;URL=/newpath/newpage.asp">
Esto trae a El problema es que el servidor proxy entre el servidor y el usuario puede proporcionar su propio mensaje que contiene un enlace a la nueva página, en lugar de cargar la nueva página directamente. Y los navegadores pueden hacer el mismo trabajo según el fabricante y la versión. Esto elimina la supuesta transparencia y hace que el acceso a su sitio sea más engorroso para el usuario, ya que continúa recibiendo mensajes de error.
Después de enviar cualquier contenido de la página, como texto o HTML, ya no podemos utilizar el método Redirect. Sin embargo, una forma que parece limitar el "impacto del servidor proxy" es asegurarse primero de que no se envíe ningún resultado (incluidos los encabezados HTTP) al cliente. En ASP 2.0, debe activar el almacenamiento en búfer y luego usar el método Clear para borrar el búfer:
Response.Buffer = True
'Algunas condiciones para seleccionar la página adecuada:
Si Request.ServerVariables("SERVER_PORT") = 1856 Entonces
StrNewPage = “/nuevaruta/esta_página.asp”
Demás
StrNewPage = “/nuevaruta/la_otra_página.asp”
Terminar si
Respuesta.Borrar
Response.Redirect strNewPage
En ASP 3.0, el almacenamiento en búfer está activado de forma predeterminada, por lo que la primera línea se puede ignorar, pero es inofensivo y garantiza que nuestra página web seguirá funcionando incluso en un entorno ASP 2.0.
En lugar de utilizar este tipo de redirección de encabezados HTTP, es mejor utilizar una nueva característica de ASP 3.0, que nos permite convertir para ejecutar otra página web a través del método Transferir del objeto Servidor. Estudiaremos este tema más a fondo en el futuro. .
1) Búfer de páginas ASP
Como ha visto, el búfer de páginas ASP 3.0 está activado de forma predeterminada en IIS 5.0 y desactivado de forma predeterminada en versiones anteriores. Microsoft nos dice que el almacenamiento en búfer proporciona una entrega de páginas web más eficiente en IIS 5.0, razón por la cual se cambió el estado predeterminado del almacenamiento en búfer. En la mayoría de los casos, esto no nos afecta. Sin embargo, si tiene una página web muy grande, o una página web que tarda un poco en crearse usando ASP u otro código y componentes del lado del servidor, a medida que se completan sus partes, podemos actualizarlas en lotes para el cliente:
.. .
... Código para crear la primera parte de la página.
...
Respuesta.Flush
...
... Código para crear la siguiente parte de la página.
...
Respuesta.Flush
...
a veces es posible que desee detener la ejecución del código en algún momento antes del final de la página, llamando al método End para actualizar todo el contenido actual al cliente y cancelar cualquier procesamiento posterior.
...
... Código para crear la primera parte de la página.
Si strUserName = "" Entonces Response.Clear
...
... Código para crear una nueva versión de esta parte de la página.
...
Aquí hay dos páginas web de ejemplo que demuestran el almacenamiento en búfer y la redirección, que se pueden descargar desde la página principal "Objeto de respuesta" (sow_response.asp). La primera página web de ejemplo de Response.Redirect se denomina redirección.asp. Inserta contenido en la página almacenada en el búfer, borra el búfer y redirige a otra página web:
para intLoop = 1 a 1000000.
Respuesta.Escribe "."
Próximo
Respuesta.Borrar
Respuesta.Redirect "show_redirect.asp"
Response.End
show_response.asp hace el mismo trabajo, pero la redirección vuelve a la página de inicio del "Objeto de respuesta". Debido a que estas páginas están almacenadas en un buffer y todos los resultados deben borrarse antes de la redirección, no hay resultados visibles en el navegador. Sin embargo, cada redirección que se produce se puede ver observando el estado del navegador. Como se muestra en la siguiente figura:
<img src=/u/info_img/2009-06/25/asp14.jpg>
En la página de inicio "Objeto de respuesta", haga clic en el enlace "Response.Flush" para abrir la segunda página web de muestra usebuffer.asp Simplemente itera a través de cada carácter de una cadena y los envía al cliente con un cierto retraso. Aunque este es un uso muy ineficiente de los servidores web y ASP, demuestra cómo funciona el almacenamiento en búfer.
<img src=/u/info_img/2009-06/25/asp15.jpg>
El siguiente es el código ASP mínimo requerido. Tenga en cuenta que actualizamos cada carácter en el navegador por separado, porque de lo contrario se almacenará en el búfer hasta el final. la página web está completa:
strText = “Este texto se ha enviado al navegador usando “ & _
"<B>Respuesta.Flush</B>
"
Para intChar =1 a Len(strText)
Para intWrite = 1 a 100000
Próximo
Respuesta.Escribir medio(strText,intChar,1)
Respuesta.Flush
Siguiente
2) Propiedad Response.IsClientConnected
La propiedad IsClientConnected ya existe en ASP 2.0, pero es algo poco confiable. Se debe enviar algún resultado al cliente antes de que devuelva un resultado preciso. Este problema se ha resuelto en ASP 3.0. Esta propiedad ahora se puede utilizar libremente.
IsClientConnected es una forma útil de observar si el usuario todavía está conectado al servidor y cargando la página web creada por ASP. Si el usuario se desconecta o deja de descargar, ya no tendremos que desperdiciar recursos del servidor creando la página web porque IIS descartará el contenido del búfer. Por lo tanto, para las páginas web que requieren mucho tiempo para calcular o utilizan muchos recursos, vale la pena verificar en cada etapa si el navegador está fuera de línea:
...
... Código para crear la primera parte de la página.
...
Si Response.IsClientConnected entonces
Respuesta.Flush
Demás
Respuesta.Fin
Terminar si
...
... Código para crear la siguiente parte de la página...