Écrire des applications CGI en Visual Basic

Cet article explique comment écrire des applications CGI.

Version d’origine du produit : Visual Basic
Numéro de la base de connaissances d’origine : 239588

Résumé

Une application CGI (Common Gateway Interface) peut être écrite dans n’importe quel langage de programmation qui peut accéder aux variables d’environnement et STDIN ou STDOUT. En raison de la puissante fonctionnalité de gestion de texte du langage de programmation Visual Basic, de nombreux développeurs Web souhaitent écrire des programmes CGI en Visual Basic. Cet article illustre les techniques d’écriture d’applications CGI en Visual Basic et fournit un exemple Visual Basic CGI simple.

Informations supplémentaires

Remarque

Microsoft fournit des exemples de programmation à titre d’illustration uniquement, sans garantie expresse ou implicite. Cela inclut, sans y être limité, les garanties implicites de commercialisation et d’adaptation à un but en particulier. Cet article considère que vous connaissez le langage de programmation présenté et les outils utilisés pour créer et déboguer des procédures. Les techniciens du Support technique Microsoft peuvent vous expliquer les fonctionnalités d’une procédure particulière, mais ils ne peuvent pas modifier les exemples en vue de vous fournir des fonctionnalités supplémentaires ou de créer des procédures répondant à vos besoins spécifiques.

Récupération des variables d’environnement

Pour récupérer une variable d’environnement, utilisez la Environ$ fonction en Visual Basic comme suit :

VALUE = Environ$(NAME)

Remarque

NAME est la variable d’environnement que vous souhaitez récupérer. Sa valeur est retournée dans VALUE.

Lecture à partir de STDIN et écriture dans STDOUT

Utilisez la fonction Win32 ReadFile pour lire à partir de STDIN et la WriteFile fonction pour écrire dans STDOUT. Ces fonctions nécessitent que vous fournissiez un handle à STDIN ou STDOUT. Vous pouvez utiliser la GetStdHandle fonction pour obtenir les descripteurs de STDIN ou STDOUT. Dans cet article, l’aliasing est utilisé sur la GetStdHandle fonction pour simplifier les appels de fonction. Les déclarations de ces fonctions sont les suivantes :

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

Les constantes passées à la GetStdHandle fonction sont définies comme suit :

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

Reportez-vous à la documentation MSDN pour la définition de chaque paramètre dans ces fonctions. Dans l’exemple suivant, une liste complète des variables d’environnement CGI est rendue constante. Cette opération répertorie toutes les constantes ensemble sur un ctrl-J. Il élimine également les erreurs de programmation en fournissant la validation du compilateur et IntelliSense, mais ne vous empêche pas d’entrer vos propres chaînes.

Exemple de code

Par souci de simplicité, l’interception des erreurs est omise dans l’exemple suivant (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

Formulaire HTML pour tester le 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>

Étapes de génération du fichier Hello.exe CGI :

  1. Créez un nouveau projet en tant que projet .exe standard.

  2. Supprimer le formulaire du projet.

  3. Ajoutez un module au projet et nommez-le HELLO.

  4. Définissez Sub Main comme objet de démarrage (sous Propriétés du projet).

  5. Copiez le code Visual Basic ci-dessus et collez-le dans le module.

  6. Faites Hello.exe.

    Remarque

    • L’exemple de code montre comment gérer une requête HTTP POST . Pour gérer une requête GET, l’application CGI doit récupérer la variable d’environnement QUERY_STRING . La QUERY_STRING variable contient des paires nom/valeur séparées par le & au format Name=Joe&Color=Red. L’encodage d’URL est utilisé, tous les espaces sont convertis en + et tous les caractères spéciaux tels que ! sont convertis en leurs valeurs ASCII HEX. En d’autres termes, la chaîne « Hello, World ! » est représentée sous la forme « Hello,+World%21 ». Les applications Visual Basic CGI doivent implémenter tout le code d’analyse.

    • Étant donné que l’application CGI est démarrée par le service, il se peut qu’elle ne puisse pas accéder aux partages réseau.

    • N’oubliez pas que CGI s’exécute en tant que service, qui communique avec le serveur. Par conséquent, les formulaires d’interface visuelle, les contrôles et les boîtes de message sont complètement vides de sens. En fait, une boîte de message entraîne l’arrêt de réponse d’une application CGI.

    • La gestion des erreurs doit être effectuée dans un code CGI en Visual Basic, afin que la boîte de message d’erreur par défaut ne s’affiche pas. Vous pouvez enregistrer les messages d’erreur sur le serveur ou les écrire dans le navigateur de l’utilisateur.

    • Les débogueurs Visual C peuvent déboguer des applications écrites en Visual Basic. Par conséquent, vous pouvez utiliser les techniques de débogage CGI référencées ci-dessous. Pour déboguer une application Visual Basic avec Visual C, choisissez Compiler en code natif, puis sélectionnez Créer des informations de débogage symboliques et Aucune optimisation. Lorsqu’il est terminé et que le .exe est généré, Visual C peut s’attacher à l’application CGI en cours d’exécution écrite en Visual Basic.

    • Pour tester une application CGI, copiez-la dans le répertoire virtuel IIS avec les autorisations d’exécution.

    • N’oubliez pas que les erreurs d’exécution ou les boîtes de dialogue dans le code Visual Basic peuvent entraîner l’arrêt de la réponse de l’application CGI. Si l’application CGI cesse de répondre, elle peut être exécutée dans le débogueur Visual Studio.

References