Escritura de aplicaciones de CGI en Visual Basic
En este artículo se describe cómo escribir aplicaciones de CGI.
Versión original del producto: Visual Basic
Número de KB original: 239588
Resumen
Una aplicación de interfaz de puerta de enlace común (CGI) se puede escribir en cualquier lenguaje de programación que pueda tener acceso tanto a las variables de entorno como a 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 CGI en Visual Basic y se proporciona un ejemplo de CGI de Visual Basic sencillo.
Más información
Nota:
Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía, ya sea expresa o implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. Se considera que está familiarizado con el lenguaje de programación que se muestra y con las herramientas para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos adaptados a sus necesidades específicas.
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 desde STDIN y escritura en STDOUT
Use la función Win32 ReadFile
desde STDIN
la que leer y la WriteFile
función para escribir en STDOUT
. Estas funciones requieren que proporcione un identificador a STDIN
o STDOUT
. Puede usar la GetStdHandle
función para obtener los identificadores a 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 que se pasan 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 ejemplo siguiente, se hace constante una lista completa de variables de entorno de CGI. Esto enumera todas las constantes juntas en un control Ctrl-J. También elimina los errores de programación al proporcionar la validación del compilador y IntelliSense, pero no impide que escriba sus propias cadenas.
Código de ejemplo
Por motivos de simplicidad, la captura de errores se omite en el ejemplo siguiente (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 de Hello.exe de CGI:
Cree un nuevo proyecto como un proyecto de .exe estándar.
Quitar formulario del proyecto.
Agregue un módulo al proyecto y asígnele el nombre HELLO.
Establezca
Sub Main
como objeto de inicio (en Propiedades del proyecto).Copie el código de Visual Basic anterior y péguelo en el módulo.
Haz 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 la variable deQUERY_STRING
entorno. LaQUERY_STRING
variable contiene pares nombre-valor separados por el & con 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 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 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 carecen de 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 se puede asociar a la aplicación CGI en ejecución escrita en Visual Basic.
Para probar una aplicación 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 del 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.
Referencias
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de