Visual Basic'te CGI Uygulamaları Yazma
Bu makalede CGI uygulamalarının nasıl yazıldığı açıklanır.
Orijinal ürün sürümü: Visual Basic
Özgün KB numarası: 239588
Özet
Ortak Ağ Geçidi Arabirimi (CGI) uygulaması, hem ortam değişkenlerine hem de STDIN veya STDOUT'a erişebilen herhangi bir programlama dilinde yazılabilir. Visual Basic programlama dilinin güçlü metin işleme özelliği nedeniyle, birçok Web geliştiricisi Visual Basic'te CGI programları yazmak ister. Bu makale, Visual Basic'te CGI uygulamaları yazma tekniklerini gösterir ve basit bir Visual Basic CGI örneği sağlar.
Daha fazla bilgi
Not
Microsoft, programlama örneklerini yalnızca gösterim amacıyla sağlar; örtülü veya açık garanti vermez. Buna zımni garantiler, satılabilirlik veya belirli bir amaca uygunluk da dahildir, ancak bunlarla sınırlı değildir. Bu makale, gösterilen programlama dilini ve yordamları oluşturmak ve hata ayıklamak amacıyla kullanılan araçları kullanmayı bildiğinizi varsayar. Microsoft destek mühendisleri, belirli bir yordamın işlevselliğinin açıklanmasına yardımcı olabilir, ancak gereksinimlerinizi karşılamaya yönelik olarak ek işlevsellik sağlamak veya yordamlar geliştirmek amacıyla bu örnekleri değiştirmezler.
Ortam değişkenlerini alma
Ortam değişkenini Environ$
almak için Visual Basic'teki işlevini aşağıdaki gibi kullanın:
VALUE = Environ$(NAME)
Not
AD, almak istediğiniz ortam değişkenidir. değeri içinde VALUE
döndürülür.
STDIN'den okuma ve STDOUT'a yazma
'den STDIN
okumak için Win32 ReadFile
işlevini ve WriteFile
yazmak STDOUT
için işlevini kullanın. Bu işlevler, veya STDOUT
için bir tanıtıcı STDIN
sağlamanızı gerektirir. veya tanıtıcılarını almak için STDIN
STDOUT
işlevini kullanabilirsinizGetStdHandle
. Bu makalede, işlev çağrılarını basitleştirmek için işlevde GetStdHandle
diğer ad kullanılır. Bu işlevlerin bildirimleri aşağıdaki gibidir:
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
İşleve GetStdHandle
geçirilen sabitler şöyle tanımlanır:
Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&
Bu işlevlerdeki her parametrenin tanımı için MSDN belgelerine bakın. Aşağıdaki örnekte, CGI ortam değişkenlerinin tam listesi sabit hale getiriliyor. Bu, Ctrl-J üzerindeki tüm sabitleri birlikte listeler. Ayrıca derleyici ve IntelliSense doğrulaması sağlayarak programlama hatalarını ortadan kaldırır, ancak kendi dizelerinizi girmenizi sağlamaz.
Örnek kod
Kolaylık olması için aşağıdaki örnekte hata yakalama atlanır (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'yi test etmek için HTML formu (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 dosyasını derleme adımları:
Standart bir .exe projesi olarak Yeni Proje oluşturun.
Formu Projeden Kaldırma.
Projeye bir Modül ekleyin ve HELLO olarak adlandırın.
Başlangıç Nesnesi olarak ayarlayın
Sub Main
(Proje Özellikleri altında).Yukarıdaki Visual Basic kodunu kopyalayın ve Modüle yapıştırın.
Hello.exe olun.
Not
Örnek kodda HTTP
POST
isteğinin nasıl işlenme şekli gösterilmektedir. Get isteğini işlemek için CGI uygulamasının ortam değişkeniniQUERY_STRING
alması gerekir. değişkeni,QUERY_STRING
biçimindekiName=Joe&Color=Red
& ayrılmış ad/değer çiftleri içerir. URL kodlaması kullanılır, tüm boşluklar + ve gibi tüm özel karakterlere dönüştürülür! hex ASCII değerlerine dönüştürülür. Başka bir deyişle, "Hello, World!" dizesi "Hello,+World%21" olarak temsil edilir. Visual Basic CGI uygulamalarının tüm ayrıştırma kodunu uygulaması gerekir.CGI uygulaması hizmet tarafından başlatıldığından ağ paylaşımlarına erişemeyebilir.
CGI'nin sunucuyla iletişim kuran bir hizmet olarak çalıştırıldığını unutmayın. Bu nedenle görsel arabirim formları, denetimleri ve ileti kutuları tamamen anlamsızdır. Aslında, bir ileti kutusu bir CGI uygulamasının yanıt vermeyi durdurmasına neden olur.
Varsayılan hata iletisi kutusunun görüntülenmemesi için Visual Basic'teki bir CGI kodu boyunca hata işleme gerçekleştirilmelidir. Hata iletilerini sunucuda günlüğe kaydedebilir veya kullanıcının tarayıcısına yazabilirsiniz.
Visual C hata ayıklayıcıları, Visual Basic'te yazılan uygulamalarda hata ayıklayabilir. Bu nedenle, aşağıda başvuruda bulunan CGI hata ayıklama tekniklerini kullanabilirsiniz. Visual C ile bir Visual Basic uygulamasında hata ayıklamak için Yerel Koda Derle 'yi ve ardından Sembolik Hata Ayıklama Bilgisi Oluştur ve İyileştirme Yok seçeneğini belirleyin. Tamamlandığında ve .exe oluşturulduğunda, Visual C, Visual Basic'te yazılmış çalışan CGI uygulamasına bağlanabilir.
Bir CGI uygulamasını test etmek için yürütme izinlerine sahip IIS sanal dizinine kopyalayın.
Visual Basic kodundaki çalışma zamanı hatalarının veya iletişim kutularının CGI uygulamasının yanıt vermeyi durdurmasına neden olabileceğini unutmayın. CGI uygulaması yanıt vermeyi durdurursa Visual Studio hata ayıklayıcısında çalıştırılabilir.
Başvurular
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin