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:
Creare un nuovo progetto come progetto .exe standard.
Rimuovere form dal progetto.
Aggiungere un modulo al progetto e denominarlo HELLO.
Impostare
Sub Main
come oggetto di avvio (in Proprietà progetto).Copiare il codice Visual Basic precedente e incollarlo nel modulo.
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 diQUERY_STRING
ambiente. LaQUERY_STRING
variabile contiene coppie nome/valore separate dal & nel formatoName=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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per