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:
Crie um novo projeto como um projeto de .exe padrão.
Remova o Formulário do Projeto.
Adicione um Módulo ao Projeto e nomeie-o HELLO.
Defina
Sub Main
como o Objeto de Inicialização (em Propriedades do Projeto).Copie o código do Visual Basic acima e cole-o no Módulo.
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 deQUERY_STRING
ambiente. AQUERY_STRING
variável contém pares de nome/valor separados pelo & no formatoName=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
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários