Condividi tramite


Scrivere applicazioni CGI in Visual Basic

Questo articolo descrive come scrivere applicazioni CGI.

Versione originale del prodotto: Visual Basic
Numero KB originale: 239588

Riassunto

Un'applicazione CGI (Common Gateway Interface) può essere scritta in qualsiasi linguaggio di programmazione in grado di accedere sia alle variabili di ambiente che a STDIN o STDOUT. Grazie alla potente funzionalità di gestione del testo del linguaggio di programmazione Visual Basic, molti sviluppatori Web vogliono scrivere programmi CGI in Visual Basic. Questo articolo illustra le tecniche per la scrittura di applicazioni CGI in Visual Basic e fornisce un semplice esempio CGI di Visual Basic.

Maggiori informazioni

Annotazioni

Microsoft fornisce esempi di programmazione solo per l'illustrazione, senza garanzia espressa o implicita. Ciò include, ma non solo, le garanzie implicite di commerciabilità o idoneità per uno scopo specifico. Questo articolo presuppone che si abbia familiarità con il linguaggio di programmazione dimostrato e con gli strumenti usati per creare e eseguire il debug delle procedure. I tecnici del supporto Tecnico Microsoft possono aiutare a spiegare le funzionalità di una determinata procedura, ma non modificheranno questi esempi per fornire funzionalità aggiuntive o costruire procedure per soddisfare i requisiti specifici.

Recupero delle variabili di ambiente

Per recuperare una variabile di ambiente, usare la Environ$ funzione in Visual Basic come indicato di seguito:

VALUE = Environ$(NAME)

Annotazioni

NAME è la variabile di ambiente che si desidera recuperare. Il relativo valore viene restituito in VALUE.

Lettura da STDIN e scrittura in STDOUT

Usare la funzione Win32 ReadFile per leggere da STDIN e la funzione WriteFile per scrivere in STDOUT. Queste funzioni richiedono di fornire un handle a STDIN o STDOUT. È possibile usare la GetStdHandle funzione per ottenere gli handle in STDIN o STDOUT. In questo articolo viene usato l'aliasing nella GetStdHandle funzione per semplificare le chiamate di funzione. Le dichiarazioni per queste funzioni sono le seguenti:

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

Le costanti passate alla GetStdHandle funzione sono definite come:

Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&

Per la definizione di ogni parametro in tali funzioni, vedere la documentazione MSDN. Nell'esempio seguente viene reso costante un elenco completo delle variabili di ambiente CGI. Vengono elencate tutte le costanti insieme su Ctrl-J. Elimina anche gli errori di programmazione fornendo la convalida del compilatore e di IntelliSense, ma non impedisce l'immissione di stringhe personalizzate.

Esempio di codice

Per semplicità, l'intercettazione degli errori viene omessa nel seguente esempio (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

Modulo HTML per testare 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>

Passaggi per compilare il file di Hello.exe CGI:

  1. Creare un nuovo progetto come progetto di .exe standard.

  2. Rimuovere il modulo dal progetto.

  3. Aggiungere un modulo al progetto e denominarlo HELLO.

  4. Impostare Sub Main come oggetto di avvio (in Proprietà progetto).

  5. Copiare il codice visual Basic precedente e incollarlo nel modulo.

  6. Impostare Hello.exe.

    Annotazioni

    • Il codice di esempio illustra come gestire una richiesta HTTP POST . Per gestire una richiesta GET, l'applicazione CGI deve recuperare la QUERY_STRING variabile di ambiente. La QUERY_STRING variabile contiene coppie nome/valore separate da e nel formato Name=Joe&Color=Red. Viene usata la codifica URL, tutti gli spazi vengono convertiti in + e tutti i caratteri speciali, ad esempio ! vengono convertiti in valori ASCII HEX. In altre parole, la stringa "Hello, World!" è rappresentata come "Hello,+World%21". Le applicazioni CGI di Visual Basic devono implementare tutto il codice di analisi.

    • Poiché l'applicazione CGI viene avviata dal servizio, potrebbe non essere in grado di accedere alle condivisioni di rete.

    • Tenere presente che CGI viene eseguito come servizio, che comunica con il server. Pertanto, i moduli, i controlli e le finestre di messaggio dell'interfaccia visiva sono completamente inutili. In effetti, una finestra di messaggio farà sì che un'applicazione CGI smetta di rispondere.

    • La gestione degli errori deve essere eseguita in tutto un codice CGI in Visual Basic, in modo che la finestra di messaggio di errore predefinita non venga visualizzata. È possibile registrare i messaggi di errore nel server o scriverli nel browser dell'utente.

    • I debugger di Visual C possono eseguire il debug di applicazioni scritte in Visual Basic. Pertanto, è possibile usare le tecniche di debug CGI a cui si fa riferimento di seguito. Per eseguire il debug di un'applicazione Visual Basic con Visual C, scegliere Compila in codice nativo e quindi selezionare Crea informazioni di debug simbolico e Nessuna ottimizzazione. Quando è completato e il file .exe viene generato, Visual C può collegarsi all'applicazione CGI in esecuzione scritta in Visual Basic.

    • Per testare un'applicazione CGI, copiarla nella directory virtuale IIS con autorizzazioni Di esecuzione.

    • Tenere presente che gli errori di runtime o le finestre di dialogo nel codice Visual Basic possono causare l'arresto della risposta dell'applicazione CGI. Se l'applicazione CGI smette di rispondere, può essere eseguita nel debugger di Visual Studio.

References