Compartir a través de


Escritura de aplicaciones de CGI en Visual Basic

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:

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

  2. Quite el 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. 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 la QUERY_STRING variable de entorno. La QUERY_STRING variable contiene pares nombre-valor separados por el y en 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 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.

Referencias