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:

  1. Cree un nuevo proyecto como un proyecto de .exe estándar.

  2. Quitar formulario del proyecto.

  3. Agregue un módulo al proyecto y asígnele el nombre HELLO.

  4. Establezca Sub Main como objeto de inicio (en Propiedades del proyecto).

  5. Copie el código de Visual Basic anterior y péguelo en el módulo.

  6. 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 de QUERY_STRING entorno. La QUERY_STRING variable contiene pares nombre-valor separados por el & con el formato Name=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