Написание приложений CGI в Visual Basic
В этой статье описывается написание приложений CGI.
Исходная версия продукта: Visual Basic
Исходный номер базы знаний: 239588
Сводка
Приложение интерфейса общего шлюза (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>
Действия по созданию файла Hello.exe CGI:
Создайте новый проект в качестве стандартного проекта .exe.
Удалите форму из проекта.
Добавьте модуль в проект и назовите его HELLO.
Задайте
Sub Main
в качестве запускаемого объекта (в разделе Свойства проекта).Скопируйте приведенный выше код Visual Basic и вставьте его в модуль.
Сделайте Hello.exe.
Примечание.
В примере кода показано, как обрабатывать HTTP-запрос
POST
. Для обработки запроса GET приложение CGI должно получитьQUERY_STRING
переменную среды. ПеременнаяQUERY_STRING
содержит пары "имя-значение", разделенные & в форматеName=Joe&Color=Red
. Используется кодировка URL-адреса, все пробелы преобразуются в + и все специальные символы, такие как ! преобразуются в значения ASCII HEX. Другими словами, строка "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 с разрешениями Execute.
Имейте в виду, что ошибки среды выполнения или диалоговые окна в коде Visual Basic могут привести к тому, что приложение CGI перестанет отвечать на запросы. Если приложение CGI перестает отвечать на запросы, его можно запустить в отладчике Visual Studio.
Ссылки
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по