Visual Basic에서 CGI 애플리케이션 작성

이 문서에서는 CGI 애플리케이션을 작성하는 방법을 설명합니다.

원래 제품 버전: Visual Basic
원래 KB 번호: 239588

요약

CGI(Common Gateway Interface) 애플리케이션은 환경 변수와 STDIN 또는 STDOUT 모두에 액세스할 수 있는 모든 프로그래밍 언어로 작성할 수 있습니다. Visual Basic 프로그래밍 언어의 강력한 텍스트 처리 기능으로 인해 많은 웹 개발자는 Visual Basic에서 CGI 프로그램을 작성하려고 합니다. 이 문서에서는 Visual Basic에서 CGI 애플리케이션을 작성하는 기술을 설명하고 간단한 Visual Basic CGI 샘플을 제공합니다.

추가 정보

참고

Microsoft에서 제공하는 프로그래밍 예제는 예시를 위한 것일 뿐이며 이와 관련하여 명시적이거나 묵시적인 어떠한 보증도 하지 않습니다. 이는 상품성이나 특정 목적에 대한 적합성의 묵시적인 보증을 포함하며 이에 제한되지 않습니다. 이 문서에서는 예제에 사용되고 있는 프로그래밍 언어와 프로시저를 만들고 디버깅하는 데 사용되는 도구를 사용자가 잘 알고 있는 것으로 가정합니다. Microsoft 지원 엔지니어는 사용자에게 도움이 되도록 특정 프로시저에 대한 기능을 설명할 수 있지만 사용자의 특정 요구 사항에 맞도록 예제를 수정하여 추가 기능을 제공하거나 프로시저를 구성하지는 않습니다.

환경 변수 검색

환경 변수를 검색하려면 다음과 같이 Visual Basic에서 함수를 사용합니다 Environ$ .

VALUE = Environ$(NAME)

참고

NAME은 검색하려는 환경 변수입니다. 해당 값은 에서 반환됩니다 VALUE.

STDIN에서 읽고 STDOUT에 쓰기

Win32 ReadFile 함수를 사용하여 에서 STDIN 읽고 함수를 WriteFile 사용하여 에 STDOUT씁니다. 이러한 함수를 사용하려면 또는 STDOUT에 대한 핸들을 STDIN 제공해야 합니다. 함수를 GetStdHandle 사용하여 또는 STDOUT에 대한 핸들을 가져올 수 있습니다STDIN. 이 문서에서는 함수 호출을 간소화하기 위해 함수에 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

CGI(Test.htm)를 테스트하는 HTML 양식

<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 검색해야 합니다. 변수에는 QUERY_STRING 형식 Name=Joe&Color=Red의 & 구분된 이름/값 쌍이 포함됩니다. URL 인코딩이 사용되고, 모든 공백이 + 로 변환되고, 와 같은 모든 특수 문자가 사용됩니다. 는 HEX ASCII 값으로 변환됩니다. 즉, "Hello, World!" 문자열은 "Hello,+World%21"로 표시됩니다. Visual Basic CGI 애플리케이션은 모든 구문 분석 코드를 구현해야 합니다.

    • CGI 애플리케이션은 서비스에서 시작되므로 네트워크 공유에 액세스하지 못할 수 있습니다.

    • CGI는 서버와 통신하는 서비스로 실행됩니다. 따라서 시각적 인터페이스 양식, 컨트롤 및 메시지 상자는 완전히 의미가 없습니다. 실제로 메시지 상자는 CGI 애플리케이션의 응답을 중지합니다.

    • 기본 오류 메시지 상자가 표시되지 않도록 Visual Basic의 CGI 코드 전체에서 오류 처리를 수행해야 합니다. 서버에서 오류 메시지를 기록하거나 사용자의 브라우저에 쓸 수 있습니다.

    • Visual C 디버거는 Visual Basic으로 작성된 애플리케이션을 디버그할 수 있습니다. 따라서 아래에서 참조하는 CGI 디버깅 기술을 사용할 수 있습니다. Visual C를 사용하여 Visual Basic 애플리케이션을 디버그하려면 네이티브 코드로 컴파일을 선택한 다음, 기호 디버그 정보 만들기 및 최적화 없음 을 선택합니다. 완료되면 .exe 생성되면 Visual C는 Visual Basic으로 작성된 실행 중인 CGI 애플리케이션에 연결할 수 있습니다.

    • CGI 애플리케이션을 테스트하려면 실행 권한이 있는 IIS 가상 디렉터리에 복사합니다.

    • Visual Basic 코드의 런타임 오류 또는 대화 상자로 인해 CGI 애플리케이션의 응답이 중지될 수 있습니다. CGI 애플리케이션의 응답이 중지되면 Visual Studio 디버거에서 실행할 수 있습니다.

참조