Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se describe cómo escribir aplicaciones CGI.
Versión original del producto: Visual Basic
Número de KB original: 239588
Resumen
Una aplicación de Common Gateway Interface (CGI) se puede escribir en cualquier lenguaje de programación que pueda tener acceso a las variables de entorno y STDIN o STDOUT. Debido a la eficaz capacidad de control de texto del lenguaje de programación de Visual Basic, muchos desarrolladores web quieren escribir programas CGI en Visual Basic. En este artículo se muestran las técnicas para escribir aplicaciones de CGI en Visual Basic y se proporciona un ejemplo sencillo de CGI de Visual Basic.
Información adicional
Nota:
Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía, ya sea expresa o implícita. Esto incluye, pero no se limita a, las garantías implícitas de comerciabilidad o idoneidad para un propósito determinado. En este artículo se supone que está familiarizado con el lenguaje de programación que se muestra y con las herramientas que se usan para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden ayudar a explicar la funcionalidad de un procedimiento determinado, pero no modificarán estos ejemplos para proporcionar funcionalidad adicional ni procedimientos de construcción para satisfacer sus requisitos específicos.
Recuperación de variables de entorno
Para recuperar una variable de entorno, use la Environ$ función en Visual Basic como se indica a continuación:
VALUE = Environ$(NAME)
Nota:
NAME es la variable de entorno que desea recuperar. Su valor se devuelve en VALUE.
Lectura de STDIN y escritura en STDOUT
Usa la función Win32 ReadFile para leer desde STDIN y la función WriteFile para escribir en STDOUT. Estas funciones requieren que proporcione un identificador a STDIN o STDOUT. Puede usar la función GetStdHandle para obtener los identificadores de STDIN o STDOUT. En este artículo, el alias se usa en la GetStdHandle función para simplificar las llamadas de función. Las declaraciones de estas funciones son las siguientes:
Public Declare Function stdin Lib "kernel32" Alias "GetStdHandle" _
(Optional ByVal Handletype As Long = STD_INPUT_HANDLE) As Long
Public Declare Function stdout Lib "kernel32" Alias "GetStdHandle" _
(Optional ByVal Handletype As Long = STD_OUTPUT_HANDLE) As Long
Public Declare Function ReadFile Lib "kernel32" _
(ByVal hFile As Long, ByVal lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, Optional ByVal lpOverlapped As Long = 0&) As Long
Public Declare Function WriteFile Lib "kernel32" _
(ByVal hFile As Long, ByVal lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, _
lpNumberOfBytesWritten As Long, Optional ByVal lpOverlapped As Long = 0&) As Long
Las constantes pasadas a la GetStdHandle función se definen como:
Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&
Consulte la documentación de MSDN para obtener la definición de cada parámetro de esas funciones. En el siguiente ejemplo, se convierte en constante una lista completa de variables de entorno de CGI. Esto enumera todas las constantes juntas en ctrl-J. También elimina los errores de programación al proporcionar validación del compilador e IntelliSense, pero no impide que escriba sus propias cadenas.
Código de ejemplo
En aras de simplificar, se omite la captura de errores en el siguiente ejemplo (Hello.bas):
Option Explicit
Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&
Public Const CGI_AUTH_TYPE As String = "AUTH_TYPE"
Public Const CGI_CONTENT_LENGTH As String = "CONTENT_LENGTH"
Public Const CGI_CONTENT_TYPE As String = "CONTENT_TYPE"
Public Const CGI_GATEWAY_INTERFACE As String = "GATEWAY_INTERFACE"
Public Const CGI_HTTP_ACCEPT As String = "HTTP_ACCEPT"
Public Const CGI_HTTP_REFERER As String = "HTTP_REFERER"
Public Const CGI_HTTP_USER_AGENT As String = "HTTP_USER_AGENT"
Public Const CGI_PATH_INFO As String = "PATH_INFO"
Public Const CGI_PATH_TRANSLATED As String = "PATH_TRANSLATED"
Public Const CGI_QUERY_STRING As String = "QUERY_STRING"
Public Const CGI_REMOTE_ADDR As String = "REMOTE_ADDR"
Public Const CGI_REMOTE_HOST As String = "REMOTE_HOST"
Public Const CGI_REMOTE_USER As String = "REMOTE_USER"
Public Const CGI_REQUEST_METHOD As String = "REQUEST_METHOD"
Public Const CGI_SCRIPT_NAME As String = "SCRIPT_NAME"
Public Const CGI_SERVER_NAME As String = "SERVER_NAME"
Public Const CGI_SERVER_PORT As String = "SERVER_PORT"
Public Const CGI_SERVER_PROTOCOL As String = "SERVER_PROTOCOL"
Public Const CGI_SERVER_SOFTWARE As String = "SERVER_SOFTWARE"
Public Declare Function Sleep Lib "kernel32" _
(ByVal dwMilliseconds As Long) As Long
Public Declare Function stdin Lib "kernel32" Alias "GetStdHandle" _
(Optional ByVal Handletype As Long = STD_INPUT_HANDLE) As Long
Public Declare Function stdout Lib "kernel32" Alias "GetStdHandle" _
(Optional ByVal Handletype As Long = STD_OUTPUT_HANDLE) As Long
Public Declare Function ReadFile Lib "kernel32" _
(ByVal hFile As Long, ByVal lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, Optional ByVal lpOverlapped As Long = 0&) As Long
Public Declare Function WriteFile Lib "kernel32" _
(ByVal hFile As Long, ByVal lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, _
lpNumberOfBytesWritten As Long, Optional ByVal lpOverlapped As Long = 0&) As Long
Sub Main()
Dim sReadBuffer As String
Dim sWriteBuffer As String
Dim lBytesRead As Long
Dim lBytesWritten As Long
Dim hStdIn As Long
Dim hStdOut As Long
Dim iPos As Integer
' sleep for one minute so the debugger can attach and set a break
' point on line below
' Sleep 60000
sReadBuffer = String$(CLng(Environ$(CGI_CONTENT_LENGTH)), 0)' Get STDIN handle
hStdIn = stdin()' Read client's input
ReadFile hStdIn, sReadBuffer, Len(sReadBuffer), lBytesRead
' Find '=' in the name/value pair and parse the buffer
iPos = InStr(sReadBuffer, "=")
sReadBuffer = Mid$(sReadBuffer, iPos + 1)' Construct and send response to the client
sWriteBuffer = "HTTP/1.0 200 OK" & vbCrLf & "Content-Type: text/html" & _
vbCrLf & vbCrLf & "Hello "
hStdOut = stdout()
WriteFile hStdOut, sWriteBuffer, Len(sWriteBuffer) + 1, lBytesWritten
WriteFile hStdOut, sReadBuffer, Len(sReadBuffer), lBytesWritten
End Sub
Formulario HTML para probar el CGI (Test.htm)
<HTML>
<HEAD>
<TITLE>Testing VB CGI</TITLE>
</HEAD>
<BODY>
<FORM action="/cgi-bin/hello.exe" method="POST">
<INPUT TYPE="TEXT" NAME="Name"> Name<BR>
<INPUT TYPE="SUBMIT">
</FORM>
</BODY>
</HTML>
Pasos para compilar el archivo Hello.exe de CGI:
Cree un nuevo proyecto como un proyecto de .exe estándar.
Quite el formulario del proyecto.
Agregue un módulo al proyecto y asígnele el nombre HELLO.
Establezca
Sub Maincomo objeto de inicio (en Propiedades del proyecto).Copie el código de Visual Basic anterior y péguelo en el módulo.
Cree Hello.exe.
Nota:
El código de ejemplo muestra cómo controlar una solicitud HTTP
POST. Para controlar una solicitud GET, la aplicación CGI debe recuperar laQUERY_STRINGvariable de entorno. LaQUERY_STRINGvariable contiene pares nombre-valor separados por el y en el formatoName=Joe&Color=Red. Se usa la codificación url, todos los espacios se convierten en + y todos los caracteres especiales, como ! se convierten en sus valores ASCII HEX. En otras palabras, la cadena "Hello, World!" se representa como "Hello,+World%21". Las aplicaciones de CGI de Visual Basic tienen que implementar todo el código de análisis.Dado que el servicio inicia la aplicación CGI, es posible que no pueda acceder a los recursos compartidos de red.
Tenga en cuenta que CGI se ejecuta como un servicio, que se comunica con el servidor. Por lo tanto, los formularios de interfaz visual, los controles y los cuadros de mensaje no tienen sentido. De hecho, un cuadro de mensaje hará que una aplicación de CGI deje de responder.
El control de errores debe realizarse a lo largo de un código CGI en Visual Basic, de modo que no se muestre el cuadro de mensaje de error predeterminado. Puede registrar mensajes de error en el servidor o escribirlos en el explorador del usuario.
Los depuradores de Visual C pueden depurar aplicaciones escritas en Visual Basic. Por lo tanto, puede usar las técnicas de depuración de CGI a las que se hace referencia a continuación. Para depurar una aplicación de Visual Basic con Visual C, elija Compilar en código nativo y, a continuación, seleccione Crear información de depuración simbólica y Sin optimización . Cuando se completa y se genera el .exe, Visual C puede asociarse a la aplicación CGI en ejecución escrita en Visual Basic.
Para probar una aplicación de CGI, cópiela en el directorio virtual de IIS con permisos de ejecución.
Tenga en cuenta que los errores en tiempo de ejecución o los cuadros de diálogo en el código de Visual Basic pueden hacer que la aplicación CGI deje de responder. Si la aplicación CGI deja de responder, se puede ejecutar en el depurador de Visual Studio.