Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano sposób pisania aplikacji CGI.
Oryginalna wersja produktu: Visual Basic
Oryginalny numer KB: 239588
Podsumowanie
Aplikację common gateway interface (CGI) można napisać w dowolnym języku programowania, który może uzyskiwać dostęp zarówno do zmiennych środowiskowych, jak i STDIN lub STDOUT. Ze względu na zaawansowaną obsługę tekstu w języku programowania Visual Basic wielu deweloperów sieci Web chce pisać programy CGI w Visual Basic. W tym artykule przedstawiono techniki pisania aplikacji CGI w języku Visual Basic i udostępniają prosty przykład języka CGI w języku Visual Basic.
Więcej informacji
Uwaga / Notatka
Firma Microsoft podaje przykłady programowania tylko dla celów ilustracyjnych, nie udzielając żadnej rękojmi, wyrażonej wprost ani dorozumianej, Obejmuje to, ale nie ogranicza się do domniemanych gwarancji możliwości handlowych lub przydatności do określonego celu. W tym artykule założono, że znasz język programowania, który jest demonstrowany i z narzędziami używanymi do tworzenia i debugowania procedur. Inżynierowie pomocy technicznej firmy Microsoft mogą pomóc wyjaśnić funkcjonalność określonej procedury, ale nie zmodyfikują tych przykładów, aby zapewnić dodatkowe funkcje lub procedury konstruowania w celu spełnienia określonych wymagań.
Pobieranie zmiennych środowiskowych
Aby pobrać zmienną środowiskową, użyj Environ$ funkcji w języku Visual Basic w następujący sposób:
VALUE = Environ$(NAME)
Uwaga / Notatka
NAME to zmienna środowiskowa, którą chcesz pobrać. Jego wartość jest zwracana w pliku VALUE.
Odczytywanie ze STDIN i zapisywanie do STDOUT
Użyj funkcji Win32ReadFile, aby odczytać z STDIN oraz funkcji WriteFile, aby zapisać do STDOUT. Te funkcje wymagają podania dojścia do STDIN lub STDOUT. Możesz użyć funkcji GetStdHandle, aby pobrać uchwyty do STDIN lub STDOUT. W tym artykule aliasowanie jest używane w GetStdHandle funkcji w celu uproszczenia wywołań funkcji. Deklaracje dla tych funkcji są następujące:
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
Stałe przekazywane do GetStdHandle funkcji są definiowane jako:
Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&
Zapoznaj się z dokumentacją MSDN, aby uzyskać definicję każdego parametru w tych funkcjach. W poniższym przykładzie pełna lista zmiennych środowiskowych CGI jest ustalana jako stała. Ta funkcja wyświetla wszystkie stałe po naciśnięciu Ctrl-J. Eliminuje również błędy programowania, zapewniając kompilator i walidację funkcji IntelliSense, ale nie wyklucza wprowadzania własnych ciągów.
Przykładowy kod
Dla uproszczenia, w poniższym przykładzie (Hello.bas) pominięto obsługę błędów.
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
Formularz HTML do testowania 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>
Kroki tworzenia pliku Hello.exe CGI:
Utwórz nowy projekt jako standardowy projekt .exe.
Usuń formularz z projektu.
Dodaj moduł do projektu i nadaj mu nazwę HELLO.
Ustaw
Sub Mainjako obiekt startowy (w obszarze Właściwości projektu).Skopiuj powyższy kod Visual Basic i wklej go do modułu.
Utwórz Hello.exe.
Uwaga / Notatka
Przykładowy kod przedstawia sposób obsługi żądania HTTP
POST. Aby obsłużyć żądanie GET, aplikacja CGI musi pobrać zmiennąQUERY_STRINGśrodowiskową. ZmiennaQUERY_STRINGzawiera pary nazwa/wartość oddzielone znakiem i w formacieName=Joe&Color=Red. Używane jest kodowanie adresów URL, wszystkie spacje są konwertowane na + i wszystkie znaki specjalne, takie jak ! są konwertowane na wartości ASCII w formacie HEX. Innymi słowy ciąg "Hello, World!" jest reprezentowany jako "Hello,+World%21". Aplikacje Visual Basic CGI muszą implementować cały kod analizowania.Ponieważ aplikacja CGI jest uruchamiana przez usługę, może nie być w stanie uzyskać dostępu do udziałów sieciowych.
Należy pamiętać, że usługa CGI działa jako usługa, która komunikuje się z serwerem. W związku z tym formularze interfejsu wizualnego, kontrolki i pola komunikatów są całkowicie bez znaczenia. W rzeczywistości pole komunikatu spowoduje, że aplikacja CGI przestanie odpowiadać.
Obsługa błędów powinna być przeprowadzana w całym kodzie CGI w Visual Basic, aby domyślne okno komunikatu o błędzie nie było wyświetlane. Możesz rejestrować komunikaty o błędach na serwerze lub zapisywać je w przeglądarce użytkownika.
Debugery języka Visual C mogą debugować aplikacje napisane w Visual Basic. W związku z tym można użyć technik debugowania CGI wymienionych poniżej. Aby debugować aplikację Języka Visual Basic przy użyciu języka Visual C, wybierz pozycję Kompiluj do kodu natywnego, a następnie wybierz pozycję Utwórz informacje o debugowaniu symbolicznym i bez optymalizacji. Po zakończeniu i wygenerowaniu .exe program Visual C może dołączyć do uruchomionej aplikacji CGI napisanej w języku Visual Basic.
Aby przetestować aplikację CGI, skopiuj ją do wirtualnego katalogu Internet Information Services (IIS) z uprawnieniami do uruchamiania.
Należy pamiętać, że błędy środowiska uruchomieniowego lub okna dialogowe w kodzie języka Visual Basic mogą spowodować, że aplikacja CGI przestanie odpowiadać. Jeśli aplikacja CGI przestanie odpowiadać, można ją uruchomić w debugerze programu Visual Studio.