Scrivere applicazioni CGI in Visual Basic

Questo articolo descrive come scrivere applicazioni CGI.

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

Riepilogo

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. A causa della 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.

Ulteriori informazioni

Nota

Microsoft fornisce esempi di programmazione a scopo puramente illustrativo, senza alcuna garanzia di qualsiasi tipo, sia espressa che implicita, ivi incluse, senza limitazioni, le garanzie implicite di commerciabilità o idoneità per uno scopo particolare. In questo articolo si presuppone che l'utente conosca il linguaggio di programmazione in questione e gli strumenti utilizzati per creare ed eseguire il debug delle procedure. Gli esperti Microsoft sono autorizzati a fornire spiegazioni in merito alla funzionalità di una particolare routine, ma in nessun caso a modificare questi esempi per fornire funzionalità aggiuntive o a creare routine atte a soddisfare specifiche esigenze.

Recupero di variabili di ambiente

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

VALUE = Environ$(NAME)

Nota

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 WriteFile funzione per scrivere in STDOUT. Per queste funzioni è necessario fornire un handle a STDIN o STDOUT. È possibile usare la GetStdHandle funzione per ottenere gli handle a STDIN o STDOUT. In questo articolo viene usato l'aliasing sulla 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 in un controllo CTRL-J. Elimina anche gli errori di programmazione fornendo la convalida del compilatore e di IntelliSense, ma non impedisce l'immissione di stringhe personalizzate.

Codice di esempio

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

Procedura per compilare il file di Hello.exe CGI:

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

  2. Rimuovere form 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. Crea Hello.exe.

    Nota

    • Il codice di esempio illustra come gestire una richiesta HTTP POST . Per gestire una richiesta GET, l'applicazione CGI deve recuperare la variabile di QUERY_STRING ambiente. La QUERY_STRING variabile contiene coppie nome/valore separate dal & 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 nei relativi 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 privi di significato. Di fatto, una finestra di messaggio causerà l'arresto di un'applicazione CGI.

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

    • I debugger Visual C possono eseguire il debug di applicazioni scritte in Visual Basic. Di conseguenza, è 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 . Una volta completata e generata la .exe, Visual C può connettersi 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 di Visual Basic potrebbero causare l'arresto dell'applicazione CGI. Se l'applicazione CGI smette di rispondere, può essere eseguita nel debugger di Visual Studio.

Riferimenti