Gravar aplicativos CGI no Visual Basic

Este artigo descreve como escrever aplicativos CGI.

Versão original do produto: Visual Basic
Número de KB original: 239588

Resumo

Um aplicativo CGI (Common Gateway Interface) pode ser escrito em qualquer linguagem de programação que possa acessar as variáveis de ambiente e STDIN ou STDOUT. Devido ao poderoso recurso de tratamento de texto da linguagem de programação do Visual Basic, muitos desenvolvedores Da Web querem escrever programas de CGI no Visual Basic. Este artigo ilustra as técnicas para escrever aplicativos CGI no Visual Basic e fornece um exemplo de CGI simples do Visual Basic.

Mais informações

Observação

A Microsoft oferece exemplos de programação somente para ilustração, sem garantias expressas ou implícitas. Isso inclui, mas não está limitado a, as garantias implícitas de qualidade comercial ou conformidade para uma determinada finalidade. Este artigo supõe que você conhece a linguagem de programação que está sendo demonstrada e as ferramentas usadas nos processos de criação e depuração. Os engenheiros de suporte da Microsoft podem ajudá-lo, fornecendo a explicação da funcionalidade de determinado procedimento, mas não modificarão estes exemplos para fornecer funcionalidade adicional nem criarão procedimentos específicos para atender às suas necessidades específicas.

Recuperando variáveis de ambiente

Para recuperar uma variável de ambiente, use a Environ$ função no Visual Basic da seguinte maneira:

VALUE = Environ$(NAME)

Observação

NAME é a variável de ambiente que você deseja recuperar. Seu valor é retornado em VALUE.

Leitura de STDIN e gravação no STDOUT

Use a função Win32 ReadFile para ler STDIN e a WriteFile função para gravar em STDOUT. Essas funções exigem que você forneça um identificador para STDIN ou STDOUT. Você pode usar a GetStdHandle função para obter os identificadores para STDIN ou STDOUT. Neste artigo, o aliasing é usado na GetStdHandle função para simplificar as chamadas de função. As declarações para essas funções são as seguintes:

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

As constantes passadas para a GetStdHandle função são definidas como:

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

Consulte a documentação MSDN para a definição de cada parâmetro nessas funções. No exemplo a seguir, uma lista completa de variáveis de ambiente CGI é constante. Isso lista todas as constantes juntas em um Ctrl-J. Ele também elimina erros de programação fornecendo a validação do compilador e do IntelliSense, mas não impede que você insira suas próprias cadeias de caracteres.

Código de exemplo

Para simplificar, a captura de erros é omitida no exemplo a seguir (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

Formulário HTML para testar o 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>

Etapas para criar o arquivo de Hello.exe CGI:

  1. Crie um novo projeto como um projeto de .exe padrão.

  2. Remova o Formulário do Projeto.

  3. Adicione um Módulo ao Projeto e nomeie-o HELLO.

  4. Defina Sub Main como o Objeto de Inicialização (em Propriedades do Projeto).

  5. Copie o código do Visual Basic acima e cole-o no Módulo.

  6. Faça Hello.exe.

    Observação

    • O código de exemplo demonstra como lidar com uma solicitação HTTP POST . Para lidar com uma solicitação GET, o aplicativo CGI precisa recuperar a variável de QUERY_STRING ambiente. A QUERY_STRING variável contém pares de nome/valor separados pelo & no formato Name=Joe&Color=Red. A codificação de URL é usada, todos os espaços são convertidos em + , e todos os caracteres especiais, como ! são convertidos em seus valores ASCII HEX. Em outras palavras, a cadeia de caracteres "Olá, Mundo!" é representada como "Olá,+Mundo%21". Os aplicativos CGI do Visual Basic precisam implementar todo o código de análise.

    • Como o aplicativo CGI é iniciado pelo serviço, ele pode não ser capaz de acessar compartilhamentos de rede.

    • Esteja ciente de que o CGI é executado como um serviço, que se comunica com o servidor. Portanto, formulários de interface visual, controles e caixas de mensagens são completamente sem sentido. De fato, uma caixa de mensagem fará com que um aplicativo CGI pare de responder.

    • O tratamento de erros deve ser realizado em um código CGI no Visual Basic para que a caixa de mensagem de erro padrão não seja exibida. Você pode registrar mensagens de erro no servidor ou gravá-las no navegador do usuário.

    • Os depuradores do Visual C podem depurar aplicativos gravados no Visual Basic. Portanto, você pode usar as técnicas de depuração de CGI referenciadas abaixo. Para depurar um aplicativo do Visual Basic com Visual C, escolha Compilar para Código Nativo e, em seguida, selecione Criar Informações simbólicas de depuração e sem otimização . Quando ele é concluído e o .exe é gerado, o Visual C pode anexar ao aplicativo CGI em execução escrito no Visual Basic.

    • Para testar um aplicativo CGI, copie-o para o diretório virtual do IIS com permissões Execute.

    • Lembre-se de que erros de runtime ou caixas de diálogo no código do Visual Basic podem fazer com que o aplicativo CGI pare de responder. Se o aplicativo CGI parar de responder, ele poderá ser executado no depurador do Visual Studio.

Referências