Поделиться через


Написание CGI приложений на Visual Basic

В этой статье описывается написание приложений CGI.

Исходная версия продукта: Visual Basic
Исходный номер базы знаний: 239588

Сводка

Приложение Common Gateway Interface (CGI) можно написать на любом языке программирования, который может получить доступ как к переменным среды, так и к STDIN или STDOUT. Из-за мощных возможностей обработки текста языка программирования Visual Basic многие веб-разработчики хотят писать программы CGI в Visual Basic. В этой статье показаны методы написания приложений CGI в Visual Basic и простой пример CGI Visual Basic.

Дополнительные сведения

Замечание

Корпорация Майкрософт предоставляет примеры программирования только в целях демонстрации без явной или подразумеваемой гарантии. Это включает в себя, но не ограничивается, подразумеваемыми гарантиями товарной пригодности или пригодности для определенной цели. В этой статье предполагается, что вы знакомы с языком программирования, который демонстрируется, и с инструментами, которые используются для создания и отладки процедур. Инженеры службы поддержки Майкрософт могут объяснить функциональные возможности определенной процедуры, но они не изменят эти примеры, чтобы предоставить добавленные функциональные возможности или процедуры создания для удовлетворения конкретных требований.

Получение переменных среды

Чтобы получить переменную среды, используйте функцию Environ$ в Visual Basic следующим образом:

VALUE = Environ$(NAME)

Замечание

NAME — это переменная среды, которую требуется извлечь. Его значение возвращается в VALUE.

Чтение из STDIN и запись в STDOUT

Используйте функцию Win32 ReadFile для чтения из STDIN, а функцию WriteFile для записи в STDOUT. Для этих функций требуется предоставить дескриптор STDIN или STDOUT. Функцию GetStdHandle можно использовать для получения дескрипторов STDIN или STDOUT. В этой статье псевдоним используется для функции GetStdHandle, чтобы упростить вызовы функций. Объявления этих функций приведены следующим образом:

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

Константы, передаваемые GetStdHandle функции, определяются следующим образом:

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

Ознакомьтесь с документацией MSDN по определению каждого параметра в этих функциях. В следующем примере полный список переменных среды CGI становится константой. При нажатии Ctrl-J отображаются все константы списком. Кроме того, он устраняет ошибки программирования, предоставляя проверку компилятора и IntelliSense, но не препятствует вводу собственных строк.

Пример кода

Для простоты перехват ошибок опущен в следующем примере (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

HTML-форма для тестирования 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>

Действия по сборке файла CGI Hello.exe:

  1. Создайте новый проект в качестве стандартного проекта .exe.

  2. Удалите форму из проекта.

  3. Добавьте модуль в проект и назовите его HELLO.

  4. Задайте Sub Main в качестве объекта запуска (в разделе "Свойства проекта").

  5. Скопируйте приведенный выше код Visual Basic и вставьте его в модуль.

  6. Сделайте Hello.exe.

    Замечание

    • В примере кода показано, как обрабатывать HTTP-запрос POST . Для обработки запроса GET приложение CGI должно получить QUERY_STRING переменную среды. Переменная содержит пары имя/значение, разделенные символом & в формате . Используется кодировка URL-адресов, все пробелы преобразуются в + и все специальные символы, такие как ! преобразуются в соответствующие значения HEX ASCII. Другими словами, строка "Hello, World!" представлена как "Hello,+World%21". Приложения CGI Visual Basic должны реализовать весь код синтаксического анализа.

    • Так как приложение CGI запускается службой, он может не иметь доступа к сетевым ресурсам.

    • Помните, что CGI выполняется как услуга, которая взаимодействует с сервером. Поэтому формы визуального интерфейса, элементы управления и поля сообщений совершенно бессмысленны. По сути, поле сообщения приведет к остановке ответа приложения CGI.

    • Обработка ошибок должна выполняться в коде CGI в Visual Basic, чтобы окно сообщения об ошибке по умолчанию не отображалось. Вы можете записывать сообщения об ошибках на сервере или записывать их в браузер пользователя.

    • Отладчики Visual C могут выполнять отладку приложений, написанных в Visual Basic. Таким образом, можно использовать приведенные ниже методы отладки CGI. Чтобы выполнить отладку приложения Visual Basic с помощью Visual C, выберите "Компиляция в машинный код", а затем выберите "Создать символьную отладочную информацию" и "Нет оптимизации". После завершения и создания .exe Visual C может присоединиться к работающему приложению CGI, написанному в Visual Basic.

    • Чтобы протестировать приложение CGI, скопируйте его в виртуальный каталог IIS с разрешениями на выполнение.

    • Помните, что ошибки среды выполнения или диалоговые окна в коде Visual Basic могут привести к остановке ответа приложения CGI. Если приложение CGI перестает отвечать, его можно запустить в отладчике Visual Studio.

Ссылки