บทความนี้จะอธิบายวิธีทำให้ DELPHI และอินเทอร์เน็ตทำงานร่วมกันเป็นหลัก เทคโนโลยีพิเศษสองอย่างจะมีรายละเอียดในบทความนี้:
WININET: สร้างโปรแกรมไคลเอ็นต์ FTP, HTTP และ Gopher ISAPI: ขยายบริการข้อมูลอินเทอร์เน็ต เช่น รับข้อมูลบนเซิร์ฟเวอร์และแสดงบนเบราว์เซอร์
ในโลกคอมพิวเตอร์ปัจจุบัน แนวโน้มการพัฒนาครั้งใหญ่ได้ถูกกำหนดไว้เนื่องจากกลยุทธ์ทางอินเทอร์เน็ตของ Microsoft พวกนั้นทำ
ในที่สุดยุคของ CGI (Common Gateway Interface) และเครื่องมือของบุคคลที่สามสำหรับแม้แต่เครื่องมืออินเทอร์เน็ตขั้นพื้นฐานที่สุดก็หมดไปในที่สุด จำเป็นต้องมีเครื่องมือของบุคคลที่สามที่ซับซ้อนเสมอ แต่ตอนนี้โปรแกรมเมอร์จะพบเครื่องมืออินเทอร์เน็ตมากมายที่พวกเขาต้องการซึ่งฝังอยู่ในระบบปฏิบัติการ กล่าวโดยสรุป โดยไม่ต้องลงทุนเพิ่มเติม คุณสามารถใช้ทรัพยากรของ DELPHI ได้ฟรีที่:
*พัฒนาเว็บเบราว์เซอร์
*เรียกใช้ FTP, HTTP และ Gopher ระหว่างสองแอปพลิเคชัน DELPHI หรือแอปพลิเคชัน DELPHI และ TCP
(Transmission Control Protocol) ทำหน้าที่ TCP ระหว่างเซิร์ฟเวอร์
เนื่องจาก DELPHI สามารถเรียกใช้ Windows API ได้อย่างง่ายดาย และรองรับ OCX/ActiveX ซึ่งเป็นกลยุทธ์ใหม่ของ Microsoft
กลยุทธ์นี้สอดคล้องกับแผนของเราอย่างสมบูรณ์แบบ Microsoft ผลิตเครื่องมือ และโปรแกรมเมอร์ DELPHI ก็ได้รับรางวัล!
บทความนี้มีอะไรบ้าง?
บทความนี้ประกอบด้วย 3 ส่วนหลักและส่วนย่อย โดยมี 3 หัวข้อหลัก ได้แก่
*ค้นหาเอกสาร: เอกสารทางเทคนิคที่กล่าวถึงในบทความนี้มีอยู่ที่นี่ และรวมถึงคำอธิบายโดยย่อเกี่ยวกับฮาร์ดแวร์และซอฟต์แวร์ที่คุณจะต้องใช้ในการเรียกใช้โค้ดในบทความนี้
*ISAPI: วิธีการใช้งาน ISAPI
*WININET: วิธีการใช้งาน WININET
ในกรณีส่วนใหญ่ ส่วน ISAPI และ WININET ในบทความนี้มีความเป็นอิสระอย่างสมบูรณ์ และคุณสามารถเลือกลำดับการอ่านได้อย่างอิสระ
ค้นหาข้อมูล ข้อกำหนดด้านฮาร์ดแวร์และซอฟต์แวร์
คุณจะต้องมีสำเนาของ Microsoft Windows NT 3.51 Server หรือ NT 4.0 Server ซึ่งควรแนบมาพร้อมกับเอกสาร Internet Information Services เนื่องจากคุณจะต้องเข้าใจเทคโนโลยีที่กล่าวถึงในนั้น เอกสารนี้ควรรวมอยู่ใน NT Server4.0 และผู้ใช้ NT 3.51 สามารถดาวน์โหลดได้จากเว็บไซต์ของ Microsoft หากต้องการเรียกใช้ Windows NT การกำหนดค่าขั้นต่ำของเครื่องของคุณควรเข้ากันได้กับ 486 และมีหน่วยความจำ 20 MB หรือมากกว่า
คุณต้องมีคอมพิวเตอร์เครื่องอื่นที่ติดตั้งเว็บเบราว์เซอร์ไว้ เพื่อให้ส่วน ISAPI ของบทความนี้ทำงานได้อย่างราบรื่น ประการที่สอง
เครื่องจะต้องสามารถรันซอฟต์แวร์ทั้งหมดที่รองรับเว็บเบราว์เซอร์ได้ หากเครื่องของคุณใช้ Windows 95 หรือ Windows NT
จากนั้นโค้ด WININET ในบทความนี้จะทำงานได้ดีที่สุด เว็บเบราว์เซอร์ที่มีสิทธิ์สามารถใช้งานได้ในสภาพแวดล้อมทางเทคนิคนี้
ใน Delphi เวอร์ชัน 2.0 ขึ้นไปที่ออกหลังเดือนมิถุนายน 1996 มีเครื่องมือต่างๆ ที่จำเป็นในการเชื่อมต่อ Delphi กับอินเทอร์เน็ต
ทรัพยากรเกือบทั้งหมด
หากคุณไม่มี Delphi เวอร์ชันล่าสุด [หมายเหตุ: ผู้เขียนที่นี่อ้างถึงเวอร์ชัน 2.0 (นักแปล)] คุณต้องมีบทความนี้
ไฟล์พิเศษที่กล่าวถึงในไฟล์ ซึ่งทั้งหมดนี้ใช้งานได้ฟรีบนเวิลด์ไวด์เว็บ [หมายเหตุ: หากคุณใช้ Delphi2.0 หรือสูงกว่า คุณจะไม่ได้รับอนุญาตให้พิจารณา (นักแปล)] เทคนิคทั้งหมดที่กล่าวถึงในบทความนี้สามารถทำงานได้อย่างราบรื่นในสภาพแวดล้อม Delphi2.0 แต่อาจทำงานไม่ราบรื่นในสภาพแวดล้อม Delphi 16 บิต
หากคุณต้องการดาวน์โหลดข้อมูลจาก World Wide Web ลิงค์คือ: http://www.borland.com/TechInfo/delphi/i
ดัชนี.html
[หมายเหตุ: ไม่มีอยู่แล้ว! :-((( (ผู้แปล)]
Delphi2.0 เวอร์ชันใหม่มาพร้อมกับเอกสาร WININET.PAS หากสำเนาของคุณไม่มีเอกสารดังกล่าว แสดงว่าเอกสารข้างต้น
เวิลด์ไวด์เว็บโหนดสามารถให้บริการนี้แก่คุณได้ WININET.PAS ประกอบด้วยรายการตัวแปร ฟังก์ชัน ประเภท และคุณสมบัติที่ออกแบบมาเพื่อขยาย Microsoft Windows Internet ซึ่งหมายความว่าคุณสามารถเพิ่มการรองรับ FTP, HTTP และ Gopher ให้กับแอปพลิเคชันของคุณได้อย่างง่ายดาย WININET.DLL ของ Microsoft มีการแจกจ่ายฟรี หากไม่ได้อยู่ในไดเร็กทอรี Windows/System หรือ Windows/System32 คุณสามารถรับได้จาก Microsoft นี่คือโหนดเวิลด์ไวด์เว็บที่มีไฟล์วิธีใช้หน้าต่าง WININET.H:
http://www.microsoft.com/intdev/sdk/docs/wininet/default.htm [หมายเหตุ: ดูเหมือนว่าจะหายไปแล้ว! : -( (นักแปล)]
โดยทั่วไปแล้ว บ้านออนไลน์สำหรับ Microsoft Internet Developers คือส่วน INTDEV ของโหนด Microsoft
นอกจาก WININET และ ICP แล้ว เทคโนโลยีสำคัญอีกประการหนึ่งที่ Delphi รองรับก็คือ ISAP ตามที่ระบุไว้ในเอกสารองค์กรของ Microsoft
ตามที่อธิบายไว้ เทคโนโลยีนี้ช่วยให้คุณสามารถ "'เขียน' สคริปต์ฝั่งเซิร์ฟเวอร์และกรองสคริปต์ได้ ซึ่งจะเป็นการขยาย Microsoft Internet Information Services และบริการ ISAPI Web อื่นๆ"
หากคุณต้องการค้นหาคำอธิบายเกี่ยวกับ ISAPI คุณสามารถไปที่:
http://www.microsoft.com/intdev/sdk/servapi.htm [หมายเหตุ: ขอพระเจ้าอวยพรคุณ! ;-) (นักแปล)]
ในตอนท้ายของบทความนี้ มีการแนบสำเนาของเอกสาร ISAPI คีย์ชื่อ HTTPEXT.PAS
Internet Control Pack (ICP) ที่เผยแพร่ฟรีโดย Microsoft คือชุดควบคุม OCX/ActiveX ที่คุณสามารถใช้ใน Delphi
ลากและวางลงในแอปพลิเคชัน (Delphi 2.0 มีการควบคุมเหล่านี้) พวกเขาให้การสนับสนุนทันทีสำหรับการสร้างแอปพลิเคชัน Delphi และรู้วิธีท่องเว็บ ใช้ FTP, WINSOCK และเทคโนโลยีอินเทอร์เน็ตอื่นๆ หากสำเนา Delphi ของคุณไม่มีการควบคุมเหล่านี้ คุณควรเพิ่มเอกสารเหล่านี้ลงในไดเร็กทอรี Lib ในไดเร็กทอรีที่ Delphi ตั้งอยู่ก่อนที่จะใช้งาน เอกสารดังกล่าวอยู่ภายใต้ไซต์ INDEX.HTML ของ Borland ตามลิงก์ที่กล่าวถึงข้างต้น ฉันไม่ได้กล่าวถึงการควบคุม ICP ในบทความนี้ แต่ใครก็ตามที่สนใจเทคโนโลยีนี้ควรยืนยันอย่างแน่นอนว่าเขามีสิ่งเหล่านี้
สำเนาของการควบคุม
คุณสามารถดาวน์โหลดไฟล์แอปพลิเคชัน Pascal ของฉันได้จากเว็บไซต์ของฉัน ชื่อคือ STRBOX.PAS และ MATHBOX.PAS
จะเป็นประโยชน์หากตรวจสอบไซต์นี้เป็นประจำเพื่อดูข้อมูลอัปเดตที่กล่าวถึงในบทความนี้
ในที่นี้ ฉันคิดว่าผู้อ่านคุ้นเคยกับ Delphi และ Object Pascal และผู้อ่านคุ้นเคยกับอินเทอร์เน็ต HTML
มีความเข้าใจพื้นฐานเกี่ยวกับเบราว์เซอร์และเวิลด์ไวด์เว็บเซิร์ฟเวอร์
อิซาปิ
ISAPI เป็นเทคโนโลยีที่ใช้งานง่ายแต่ทรงพลัง ซึ่งช่วยให้คุณสามารถขยายขีดความสามารถของบริการข้อมูลทางอินเทอร์เน็ตได้
เทคโนโลยีนี้มาพร้อมกับ Windows NT 4.0 และช่วยให้คุณสร้างไซต์ WEB, FTP และ GOPHER บนเซิร์ฟเวอร์ของคุณได้ ในเวลาเดียวกัน เทคโนโลยีนี้เข้ากันได้กับ WindowsNT3.51 Server [หมายเหตุ: หมายถึงเวอร์ชันเซิร์ฟเวอร์ ส่วนอีกเวอร์ชันคือเวอร์ชันเวิร์กสเตชัน (นักแปล)]
ในอดีต วิธีที่ดีที่สุดในการปรับขนาดเว็บเซิร์ฟเวอร์คือการสร้างแอปพลิเคชัน CGI พวกมันเป็นเครื่องมือที่ทรงพลัง แต่ก็เป็นเช่นนั้นเช่นกัน
จำกัดโดยรูปแบบการดำเนินการ [หมายเหตุ: ตัวอย่างเช่น PERL จะถูกตีความและดำเนินการ (นักแปล)] เมื่อคุณส่งคำขอแบบ CGI ไปยังเซิร์ฟเวอร์จากเบราว์เซอร์ แอปพลิเคชัน CGI มักจะถูกบังคับให้เข้าสู่หน่วยความจำก่อน ซึ่งจะใช้เวลานาน นอกจากนี้ ในบางกรณี เทคโนโลยี CGI ดูเหมือนจะใช้งานยากขึ้นเล็กน้อย
ISAPI เป็นวิธีการแทนที่แอปพลิเคชัน CGI โดยการเขียน DLL [หมายเหตุ: โปรแกรมลิงก์แบบไดนามิก (ตัวแปล)] คุณยังสามารถ
คุณสามารถเขียนข้อความที่กรองผ่าน ISAPI ได้ แต่ฉันจะไม่พูดถึงเทคโนโลยีนี้ในบทความนี้ เมื่อเปรียบเทียบกับ CGI แล้ว ISAPI นั้นใช้งานง่ายกว่า เร็วกว่า และใช้ทรัพยากรระบบได้ดีกว่า ในประเด็นต่อไปนี้ ผมจะอธิบายโดยละเอียดว่าเหตุใด ISAPI DLL จึงดีกว่าแอปพลิเคชัน CGI:
ISAPI DLL อยู่ในที่อยู่เดียวกันกับบริการ HTTP ดังนั้นจึงสามารถเข้าถึงบริการ HTTP ได้โดยตรงจากเซิร์ฟเวอร์ เมื่อเปรียบเทียบกับแอปพลิเคชัน CGI พวกเขาสามารถโหลดเข้าสู่หน่วยความจำได้เร็วขึ้น เมื่อทำการร้องขอบนเซิร์ฟเวอร์ จะใช้เวลาหยุดชั่วคราวน้อยกว่า [หมายเหตุ: หมายถึงเวลาระหว่างการร้องขอและรับการตอบสนองจากเซิร์ฟเวอร์ (นักแปล)] มาก สิ่งนี้สำคัญยิ่งขึ้นเมื่อเซิร์ฟเวอร์มีภาระงานหนัก
คุณสามารถควบคุมได้ว่าจะโหลดและยกเลิกการโหลด DLL เมื่อใด ตัวอย่างเช่น คุณสามารถโหลด DLL ล่วงหน้าได้ในคำขอแรก
ยกเลิกการโหลด DLL ของแอปพลิเคชัน ISAPI เมื่อไม่ได้ใช้งานเพื่อเพิ่มทรัพยากรระบบ
ตามที่กล่าวไว้ก่อนหน้านี้ คุณสามารถใช้ ISAPI เพื่อเขียนข้อความที่กรองแล้ว [หมายเหตุ: โดยทั่วไปหมายถึงสคริปต์ในโครงสร้าง C/S (นักแปล)] เพิ่มเติม
ตามเอกสารของ Microsoft คุณสามารถกรองข้อความผ่าน ISAPI เพื่อทำสิ่งต่อไปนี้:
รูปแบบการอนุญาตผู้ใช้
การบีบอัด
การเข้ารหัส
เข้าสู่ระบบ
การวิเคราะห์การรับส่งข้อมูลหรือการวิเคราะห์คำขออื่น ๆ (เช่น การค้นหาคำขอใน "....etcpassWord")
ในบทความนี้ ผมจะเน้นที่วิธีเขียน DLL ที่ส่งคืนชุดข้อมูล หรือวิธีโต้ตอบกับผู้ใช้ที่ใช้เบราว์เซอร์
ติดต่อง่ายๆ.
ข้อมูลเบื้องต้นเกี่ยวกับ ISAPI
ไฟล์ HTTPEXT.PAS มีคำสั่งหลักสำหรับการใช้ ISAPI เอกสารนี้ควรแนบไปกับ
มีการเผยแพร่เวอร์ชัน Delphi นอกจากนี้ยังสามารถพบได้บนเว็บไซต์ของ Borland ซึ่งแนบมากับส่วน ISAPI ของบทความนี้ เนื่องจากเป็นเทคโนโลยี NT คุณต้องใช้ Delphi2.0 ขึ้นไปเพื่อใช้เทคโนโลยีนี้ คุณไม่สามารถใช้สิ่งนี้กับโปรแกรมแก้ไข 16 บิต
HTTPEXT.PAS มีอินเทอร์เฟซของเทคโนโลยี ISAPI ที่สร้างโดย Microsoft [หมายเหตุ: หมายถึงอินเทอร์เฟซ Delphi ISAPI ถูกคอมไพล์ใน C ++
การเขียน (นักแปล)] เมื่อเขียน Delphi ไม่มีอินเทอร์เฟซผู้ใช้ ISAPI ให้มา ฉันจะอธิบายเฉพาะวิธีการใช้เทคโนโลยีที่มีอยู่ของ Microsoft เท่านั้น อย่างไรก็ตาม ISAPI นั้นใช้งานง่ายเกินไป และสำหรับผู้ใช้ส่วนใหญ่ เวอร์ชันของวัตถุ Delphi ของผู้ใช้ก็ไม่จำเป็น
มีฟังก์ชันสามรายการที่สามารถใช้เป็นทางเข้า ISAPI DLLs สองรายการแรกจำเป็น และรายการที่สามเป็นทางเลือก
GetExtensionVersion: ตรวจสอบเวอร์ชันขั้นต่ำ
HttpExtensionPRoc: นี่คือจุดเริ่มต้นของ DLL เช่นเดียวกับบล็อกเริ่มต้น...สิ้นสุดในแอปพลิเคชัน Delphi
TerminateExtension: นี่เป็นโปรแกรมเสริมที่สามารถใช้เป็นเธรดเพื่อล้างการจัดสรรหน่วยความจำอื่น ๆ
เมื่อคุณสร้าง ISAPI DLL คุณต้องอ้างอิงสองฟังก์ชันแรกจากสามฟังก์ชันที่แสดงรายการไว้ข้างต้น และดำเนินการนี้
สองฟังก์ชันเป็นกุญแจสำคัญในการเขียนโปรแกรม ISAPI ทั้งหมด
คำสั่งทั้งสามประกอบด้วย "word output" ซึ่งเป็นคำที่ใช้เนื่องจาก ISAPI DLLs ขยายบริการข้อมูลทางอินเทอร์เน็ต
อุปกรณ์. (โปรดจำไว้ว่า Internet Information Server หมายถึง Microsoft Server หากคุณต้องการใช้เซิร์ฟเวอร์ NT เป็นเว็บเซิร์ฟเวอร์จริง นี่เป็นเครื่องมือที่คุณต้องการอย่างแน่นอน ISAPI DLLs ได้รับการเผยแพร่ด้วย NT4.0 และได้รับการติดตั้งเมื่อติดตั้งระบบปฏิบัติการ . ถูกติดตั้งโดยอัตโนมัติ)
ISAPI จัดเตรียมมาตรฐานที่เซิร์ฟเวอร์ที่ใช้งานจริงสามารถปฏิบัติตามได้ ตัวอย่างเช่น สามารถใช้อินเทอร์เฟซ NSAPI ที่ซับซ้อนของ Netscape ได้
บีบอัดให้เป็น ISAPI ที่กระชับและสวยงามที่เกี่ยวข้องเพื่อใช้งานอินเทอร์เฟซ NSAPI
ต่อไปนี้เป็นการประกาศหน้าที่ที่สำคัญทั้งสองนี้
ฟังก์ชั่น GetExtensionVersion (var Ver: THSE_VERSION_INFO): BOOL;
ฟังก์ชั่น HttpExtensionProc (var ECB: TExtensionControlBlock): DWORD;
คุณเพียงแค่วาง GetExtensionVersion ลงใน DLL ของคุณ เท่านี้ก็เสร็จสิ้น คุณจะต้องทำการเปลี่ยนแปลงเล็กน้อยเมื่อ ISAPI ออกเวอร์ชันใหม่สู่สาธารณะเท่านั้น
ฟังก์ชัน GetExtensionVersion (var Ver: THSE_VERSION_INFO):
BOOL;
เริ่ม
Ver.dwExtensionVersion := $00010000; // รองรับ 1.0
Ver.lpszExtensionDesc := 'Delphi 2.0 ISAPI DLL'; // คำอธิบาย
ผลลัพธ์ := จริง;
จบ;
พารามิเตอร์ที่ส่งผ่านไปยังฟังก์ชันนี้ได้รับการประกาศใน HTTPEXT.PAS ดังนี้:
พารามิเตอร์ที่เกี่ยวข้องได้รับการประกาศใน HTTPEXT.PAS ดังนี้:
PHSE_VERSION_INFO = ^THSE_VERSION_INFO;
THSE_VERSION_INFO = บันทึกที่อัดแน่น
dwExtensionVersion: DWORD;
lpszExtensionDesc: อาร์เรย์ [0..HseMaxExtDLLNameLen-1] ของ Char;
จบ;
ค่าคงที่HseMaxExtDllNameLenมีค่าเท่ากับ 256 ในการประกาศ ตัวแปรสองตัวในบันทึกคือ "ประกาศตัวเอง" ตัวแปรแรกมีหมายเลขเวอร์ชัน ISAPI [หมายเหตุ: ตัวแปร dwExtensionVersion (ตัวแปล)] และตัวแปรหลังแสดงถึงสตริงที่ผู้ใช้กำหนดซึ่งใช้ในการอธิบาย DLL
เมื่อคุณอ้างอิงคำสั่ง GetExtensionVersion คุณต้องเพิ่มอินพุตไปยังส่วนไฟล์ DPR ของโปรแกรม DLL ของคุณ
ส่วนหนึ่งออก เมื่อคุณเขียนข้อความนี้ คุณควรเขียนด้วย:
การส่งออก
รับส่วนขยายเวอร์ชัน
HttpExtensionProc;
นี่คือสิ่งที่คุณทำเมื่อตั้งค่าฟังก์ชันสำหรับ ISAPI DLLs ที่สำคัญทั้งสองนี้ ขั้นตอนถัดไปโดยใช้ HttpExtensionProc นั้นซับซ้อนกว่าเล็กน้อย ดังนั้นฉันจะปล่อยให้มันเป็นอีกส่วนหนึ่ง
การทำงานกับ HttpExtensionProc
คำสั่ง HttpExtensionProc เป็นจุดเริ่มต้นของ DLL ฟังก์ชั่นของมันเหมือนกับคำสั่ง main() ในภาษา C หรือ
ส่วนเริ่มต้น...จุดสิ้นสุดในเดลฟี
นี่คือตัวอย่างง่ายๆ โดยใช้คำสั่ง GetExtensionVersion
ฟังก์ชัน HttpExtensionProc (เป็น ECB: TExtensionControlBlock):
DWORD;
var
ResStr: สตริง;
StrLen: จำนวนเต็ม;
เริ่ม
ECB.lpszLogData := 'บันทึก Delphi DLL';
ECB.dwHTTPStatusCode := 200;
ResStr := ' +
-
'สวัสดีจากอิซาปิ'
-
-
ResStr := รูปแบบ(
'HTTP/1.0 200 ตกลง'#13#10+
'ประเภทเนื้อหา: text/html'#13#10+
'ความยาวของเนื้อหา: %d'#13#10+
'เนื้อหา:'#13#10#13#10'%s'
[ความยาว(ReStr)
ResStr]);
StrLen := ความยาว (ResStr);
ECB.WriteClient(ECB.ConnID
ตัวชี้(ResStr)
สเตรเลน
0);
ผลลัพธ์ := HSE_STATUS_SUCCESS;
จบ;
หากคุณส่งคำขอ DLL นี้ขณะเรียกดู คุณจะได้รับคำตอบดังนี้:
ผลลัพธ์เซิร์ฟเวอร์ทดสอบ
สวัสดีจาก ISAPI
ฟิลด์ส่วนใหญ่ภายในเนื้อหาของฟังก์ชันมีความสัมพันธ์อย่างใกล้ชิดกับโค้ด HTML แบบง่ายที่ให้ข้อมูลพื้นฐาน คุณต้องกรอกข้อมูลบางฟิลด์ใน TExtensionControlBlock ดังที่แสดงด้านล่าง
โปรดสังเกตว่ามีตัวชี้ฟังก์ชันที่เรียกว่า WriteClient ในบันทึกนี้ คุณสามารถอ้างอิงถึงฟังก์ชันนี้เพื่อส่งข้อมูลได้
ส่งกลับไปยังเบราว์เซอร์ เมื่อเรียกใช้ฟังก์ชันนี้ คุณจะใช้ฟิลด์ ConnID ในบล็อก TExtensionControl ที่กล่าวถึงด้านล่าง เมื่อเรียกใช้ฟังก์ชัน ConnID จะถูกเติมให้คุณโดยอัตโนมัติ
ก่อนที่จะดูโค้ดของฟังก์ชันนี้ โปรดให้ฉันสาธิตฟังก์ชัน HttpExtensionProc ทั้งหมดที่กล่าวมาข้างต้นให้คุณดูก่อน
โปรแกรมที่สมบูรณ์ของ ISAPI DLL
ห้องสมุด Isapi1;
ห้องสมุด Isapi1;
การใช้งาน
หน้าต่าง
SysUtils
HTTPExt;
ฟังก์ชั่น GetExtensionVersion ( var Ver: THSE_VERSION_INFO ): BOOL;
เริ่ม
Ver.dwExtensionVersion := $00010000; // เราคาดว่าจะรองรับเวอร์ชัน 1.0
Ver.lpszExtensionDesc := 'เขียนใน Delphi 2.0';
ผลลัพธ์ := จริง;
จบ;
ฟังก์ชัน HttpExtensionProc ( var ECB: TEXTENSION_CONTROL_BLOCK ): DWORD;
stdcall;
var
ResStr: สตริง;
StrLen: จำนวนเต็ม;
เริ่ม
ECB.lpszLogData := 'บันทึก Delphi DLL';
ECB.dwHTTPStatusCode := 200;
ResStr := '
-
-
ผลลัพธ์เซิร์ฟเวอร์ทดสอบ
-
-
Isapi กล่าวสวัสดี DevRel
-
ResStr := รูปแบบ(
'HTTP/1.0 200 ตกลง'#13#10+
'ประเภทเนื้อหา: text/html'#13#10+
'ความยาวของเนื้อหา: %d'#13#10+
'เนื้อหา:'#13#10#13#10'%s'
[ความยาว(ReStr)
ResStr]);
StrLen := ความยาว (ResStr);
ECB.WriteClient(ECB.ConnID
ตัวชี้(ResStr)
สเตรเลน
0);
ผลลัพธ์ := HSE_STATUS_SUCCESS;
จบ;
การส่งออก
รับส่วนขยายเวอร์ชัน
HttpExtensionProc;
เริ่ม
จบ.
ในการรันโปรแกรม DLL นี้ คุณควรคัดลอกไปยังไดเร็กทอรีสคริปต์ภายใต้เซิร์ฟเวอร์ NT ของคุณ ในเครื่อง NT4.0 ของฉัน
มันเป็นเช่นนี้:
c:winntsystem32inetsrvscriptsmystuffisapi1.dll
ในตัวอย่างนี้ ฉันได้สร้างไดเร็กทอรีของฉันชื่อ "mystuff"
มันใช้เพื่อจัดเก็บสิ่งที่ฉันสร้างขึ้น
ISAPI DLLs แน่นอนว่าไดเร็กทอรีของคุณจะไม่เหมือนกับในเครื่องของฉันทุกประการ ขึ้นอยู่กับตำแหน่งของไดเร็กทอรี "inetsrv" และปัจจัยอื่นๆ
หากต้องการเรียก DLL นี้สำเร็จ คุณควรเพิ่มไฮเปอร์ลิงก์นี้ในหน้า HTML ของคุณ:
อิซาปิวัน
เมื่อผู้ใช้คลิกไฮเปอร์ลิงก์นี้ ISAPI1 Dll จะถูกเรียก จากนั้นสตริง "Hello from ISAPI" จะปรากฏขึ้น
ปรากฏบนเบราว์เซอร์ของผู้ใช้ หากคุณไม่วาง ISAPI.DLL ไว้ในไดเร็กทอรี mystuff คุณควรแก้ไขโค้ด HTML ด้านบนเพื่อปรับให้เข้ากับสถานการณ์ของคุณ โปรดทราบว่าไดเร็กทอรีของคุณต้องสัมพันธ์กับไดเร็กทอรี inetsrv และไม่ควรและไม่สามารถมีไดเร็กทอรีที่มี DLL ทั้งหมดของคุณอยู่
นี่คือสคริปต์ HTML ที่สมบูรณ์ของการโทร:
นี่คือโฮมเพจสำหรับคอมพิวเตอร์ที่บ้านของฉัน
อิซาปิวัน
โปรดทราบว่าหากคุณคัดลอกโปรแกรม ISAPI1.DLL ไปยังไดเร็กทอรี mystuff หลายครั้ง คุณก็ควรทำ
ปิดพอร์ตเวิลด์ไวด์เว็บของเว็บเซิร์ฟเวอร์ เนื่องจากในครั้งแรกที่คุณคัดลอก DLL นี้ คุณจะไม่มีข้อจำกัดใดๆ แต่หลังจากนั้น DLL ดังกล่าวจะเป็นของเซิร์ฟเวอร์ ดังนั้น เมื่อคุณคัดลอกสำเนาแรกเวอร์ชันอัปเดต คุณควรปิดบริการเวิลด์ไวด์เว็บ คุณสามารถใช้โปรแกรมการจัดการเครือข่ายเพื่อปิดบริการเวิลด์ไวด์เว็บ โปรแกรมนี้ควรอยู่ภายใต้กลุ่ม Microsoft Internet Server และติดตั้งภายใต้ Explorer/Program Manager เมื่อติดตั้ง Network Information Services
ทำงานร่วมกับ TExtensionControlBlock
จากจุดนี้ในบทความนี้ คุณจะสามารถสร้าง ISAPI DLL ตัวแรกและรันบนเครื่องที่สองได้
เว็บเบราว์เซอร์เรียกมันว่า
ส่วนที่เหลือของ ISAPI จะมีข้อมูลเชิงลึกมากขึ้นในบทความนี้
นี่คือส่วนที่ซับซ้อนมากขึ้นของพารามิเตอร์ HttpExtensionProc
PExtensionControlBlock = ^TExtensionControlBlock;
TExtensionControlBlock = บันทึกที่อัดแน่น
cbSize: DWORD; // = ขนาดของ (TExtensionControlBlock)
dwVersion: DWORD; // ข้อมูลเวอร์ชันของข้อมูลจำเพาะนี้
ConnID: HCONN; // บริบท ห้ามแก้ไข!
dwHttpStatusCode: DWORD; // รหัสสถานะ HTTP
// ข้อมูลบันทึกที่สิ้นสุดด้วยค่า null เฉพาะสำหรับ Extension DLL นี้
lpszLogData: อาร์เรย์ [0..HSE_LOG_BUFFER_LEN-1] ของ Char;
lpszMethod: PChar; // REQUEST_METHOD
lpszQueryString: PChar; // QUERY_STRING
lpszPathInfo: PChar; // PATH_INFO
lpszPathTranslated: PChar; // PATH_TRANSLATED
cbTotalBytes: DWORD; // จำนวนไบต์ทั้งหมดจากไคลเอนต์
cbAvailable: DWORD; // จำนวนไบต์ที่มีอยู่
lpbData: ตัวชี้; // ตัวชี้ไปยังไบต์ cbAvailable
lpszContentType: PChar; // ประเภทเนื้อหาของข้อมูลไคลเอนต์
GetServerVariable: TGetServerVariableProc;
WriteClient: TWriteClientProc;
ReadClient: TReadClientProc;
ฟังก์ชั่นการสนับสนุนเซิร์ฟเวอร์: TServerSupportFunctionProc;
จบ;
โปรดสังเกตว่าเรกคอร์ดนี้ประกอบด้วยฟิลด์ ConnID ที่กล่าวถึงข้างต้น และส่งพารามิเตอร์แรกไปยัง WriteClient
พารามิเตอร์แรกในเรกคอร์ดนี้ใช้สำหรับการควบคุมเวอร์ชัน ควรเป็นขนาดของ TExtensionControlBlock ที่ระบุ หาก Microsoft เปลี่ยนโครงสร้าง พวกเขาสามารถกำหนดเวอร์ชันของโครงสร้างที่พวกเขากำลังจัดการได้โดยการตรวจสอบขนาดบันทึก คุณไม่ต้องการสามฟิลด์แรกในเรกคอร์ดนี้ เนื่องจาก ISAPI ป้อนข้อมูลไว้แล้ว และสามารถเข้าถึงได้เฉพาะในโปรแกรมของคุณเท่านั้น ไม่สามารถเปลี่ยนแปลงได้
ฟิลด์ที่สำคัญที่สุดในเรกคอร์ดนี้อาจเป็น lpszQueryString ซึ่งมีคำขอจากเซิร์ฟเวอร์
ข้อมูล. ตัวอย่างเช่น สมมติว่าคุณได้สร้างไฟล์ชื่อ ISAPI1.Dll หากต้องการเรียก DLL นี้ คุณต้องสร้าง HREF เช่นนี้ [หมายเหตุ: รูปแบบในภาษา HTML (ตัวแปล)] บนหน้าเว็บในเบราว์เซอร์ของคุณ:
ทดสอบหนึ่ง
หากคุณต้องการตอบกลับ DLL นี้ คุณต้องเปลี่ยนบรรทัดด้านบนดังนี้:
ทดสอบหนึ่ง
หากข้อมูลโค้ด HTML มีบางอย่างที่เหมือนกับบรรทัดที่สองจากสองบรรทัดด้านบน DLL ของคุณก็จะมีพารามิเตอร์ lpszQueryString
รับสตริงของ "MyQuery" ให้ความสนใจเป็นพิเศษกับการใช้แฟล็กคำขอตามสตริงคำขอ
แน่นอน คุณสามารถเปลี่ยนสตริงคำขอได้ตามที่คุณต้องการ ตัวอย่างเช่น คุณสามารถเขียนว่า:
ทดสอบหนึ่ง
ในการร้องขอนี้ DLL นี้จะตอบกลับด้วยชื่อของเซิร์ฟเวอร์ คุณไม่อยู่ภายใต้ข้อจำกัดใดๆ เมื่อส่งพารามิเตอร์นี้ คุณ
คุณสามารถส่งผ่านสิ่งที่คุณต้องการได้ และขึ้นอยู่กับคุณว่าต้องการวิเคราะห์ข้อมูลใน DLL อย่างไร
เมื่อคุณส่งคืนข้อมูลจากเซิร์ฟเวอร์ไปยังเบราว์เซอร์ คุณใช้ตัวชี้ฟังก์ชัน "WriteClient" ในระเบียนนี้
- คุณไม่จำเป็นต้องดำเนินการใดๆ เมื่อเริ่มต้นตัวชี้นี้ เซิร์ฟเวอร์ข้อมูลเครือข่ายจะส่งผ่านไปยังคุณโดยอัตโนมัติ
ผู้เขียนแอปพลิเคชัน CGI จะทราบว่าไวยากรณ์สำหรับการส่งสตริงคำขอนั้นคุ้นเคยดี ในความเป็นจริง ISAPI ติดตาม CGI
เช่นเดียวกับแบบแผนอื่นๆ ฟิลด์ส่วนใหญ่ใน TExtensionControlBlock สามารถยืมได้โดยเทคโนโลยี CGI
ฟิลด์สำคัญอีกฟิลด์หนึ่งใน TExtensionControlBlock คือ lpbData ซึ่งมีข้อมูลเพิ่มเติมที่อัปโหลดถึงคุณจากการเรียกดู
ตัวอย่างเช่น หากคุณมีฟอร์ม HTML ที่มีหลายช่อง ข้อมูลที่อยู่ในช่องเหล่านี้จะเรียกว่า "
ตัวชี้ lpData" หัวข้อถัดไปในบทความนี้ "การรับข้อมูลจากปุ่ม 'ตกลง'" จะเน้นที่วิธีจัดการกับสถานการณ์นี้
จนถึงตอนนี้ ฉันได้แนะนำสี่ฟิลด์หลักใน TExtensionControlBlock:
WriteClient: ตัวชี้ที่ให้คุณส่งข้อมูล HTML ที่จัดรูปแบบไปยังเบราว์เซอร์ มีการใช้ฟังก์ชันนี้
ฟิลด์ ConnID ของ TExtensionControlBlock
lpszQueryString: คำขอที่มาจากเบราว์เซอร์
lpbData: ข้อมูลเพิ่มเติมที่อัปโหลดถึงคุณจากเบราว์เซอร์ โดยปกติแล้วเนื้อหาของฟิลด์ใดๆ ในรูปแบบ HTML
- ฉันจะพูดคุยเรื่องนี้เพิ่มเติมในส่วน "ปุ่มยืนยัน"
หากต้องการทราบว่าฟิลด์อื่นๆ ใน TExtensionControlBlock ทำงานอย่างไร วิธีที่ดีที่สุดคือ
เรียกดูและเปรียบเทียบ กล่าวอีกนัยหนึ่ง คุณจะต้องสร้างเพจ HTML ที่ช่วยให้ผู้ใช้สามารถเรียก ISAPI DLL ของไคลเอ็นต์ได้ วัตถุประสงค์ของ ISAPI DLL นี้คือเพียงเพื่อจัดรูปแบบแต่ละฟิลด์ใน TExtensionControlBlock ใน HTML แล้วส่งกลับไปยังเบราว์เซอร์ สิ่งนี้จะเปลี่ยนเบราว์เซอร์ของคุณให้กลายเป็นดีบักเกอร์ที่ค่อนข้างน่ากลัวซึ่งจะแสดงฟิลด์ทั้งหมดใน TExtensionControlBlock
นี่คือโปรแกรมที่เขียนโดย Danny Thorpe จาก Borland ซึ่งทำหน้าที่นี้:
ห้องสมุดทดสอบ 1;
การใช้งาน
หน้าต่าง
SysUtils
HTTPExt;
ฟังก์ชั่น GetExtensionVersion ( var Ver: THSE_VERSION_INFO ): BOOL;
เริ่ม
Ver.dwExtensionVersion := $00010000; // รองรับ 1.0
Ver.lpszExtensionDesc := 'ทดสอบ DLL ที่เขียนใน Delphi 2.0';
ผลลัพธ์ := จริง;
จบ;
ฟังก์ชัน HttpExtensionProc ( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
var
ResStr: สตริง;
StrLen: จำนวนเต็ม;
Buf: อาร์เรย์ [0..1024] ของ Char;
เริ่ม
ECB.lpszLogData := 'บันทึก Delphi DLL';
ECB.dwHTTPStatusCode := 200;
ResStr := รูปแบบ(
-
-
'ขนาด = %d'
-
'เวอร์ชัน = %.8x
-
'ConnID = %.8x
-
'วิธีการ = %s
-
'แบบสอบถาม = %s
-
'ข้อมูลเส้นทาง = %s
-
'PathTranslated = %s'
-
'จำนวนไบต์ทั้งหมด = %d
-
'ไบต์ที่มีอยู่ = %d
-
'ประเภทเนื้อหา = %s'
-
-
[ECB.cbSize
ECB.dwVersion
ECB.ConnID
ECB.lpszวิธีการ
ECB.lpszQueryString
ECB.lpszPathInfo
ECB.lpszPathแปลแล้ว
ECB.cbTotalBytes
ECB.cbมีอยู่
ECB.lpszContentType]);
กับ ECB ทำ
เริ่ม
StrLen := ขนาดของ (Buf);
GetServerVariable (ConnID
'รีโมท_ADDR'
@บุฟ
สเตรเลน);
ResStr := ResStr + 'REMOTE_ADDR = '+Buf+'
-
StrLen := SizeOf(Buf);
GetServerVariable (ConnID
'รีโมท_โฮสต์'
@บุฟ
สเตรเลน);
ResStr := ResStr + 'Remote_Host = '+Buf+'
-
StrLen := SizeOf(Buf);
GetServerVariable (ConnID
'REMOTE_USER'
@บุฟ
สเตรเลน);
ResStr := ResStr + 'Remote_User = '+Buf+'
-
StrLen := SizeOf(Buf);
GetServerVariable (ConnID
'เซิร์ฟเวอร์_NAME'
@บุฟ
สเตรเลน);
ResStr := ResStr + 'SERVER_NAME = '+Buf+'
-
StrLen := SizeOf(Buf);
GetServerVariable (ConnID
'เซิร์ฟเวอร์_พอร์ต'
@บุฟ
สเตรเลน);
ResStr := ResStr + 'SERVER_PORT = '+Buf+'
-
StrLen := SizeOf(Buf);
GetServerVariable (ConnID
'SERVER_โปรโตคอล'
@บุฟ
สเตรเลน);
ResStr := ResStr + 'SERVER_PROTOCOL = '+Buf+'
-
StrLen := SizeOf(Buf);
GetServerVariable (ConnID
'เซิร์ฟเวอร์_ซอฟต์แวร์'
@บุฟ
สเตรเลน);
ResStr := Format('%sSERVER_SOFTWARE = %s
-
'รหัสเธรด = %.8x
-
[เรสสตร
บุฟ
GetCurrentThreadID]);
จบ;
ResStr := ResStr + ';
ResStr := รูปแบบ(
'HTTP/1.0 200 ตกลง'#13#10+
'ประเภทเนื้อหา: text/html'#13#10+
'ความยาวของเนื้อหา: %d'#13#10+
'เนื้อหา:'#13#10#13#10'%s'
[ความยาว(ReStr)
ResStr]);
StrLen := ความยาว (ResStr);
ECB.WriteClient(ECB.ConnID
ตัวชี้(ResStr)
สเตรเลน
0);
ผลลัพธ์ := HSE_STATUS_SUCCESS;
จบ;
ส่งออก
รับส่วนขยายเวอร์ชัน
HttpExtensionProc;
เอกิ้น
จบ.
หากต้องการเรียก DLL นี้ คุณควรสร้างสคริปต์ HRML ที่มีบรรทัดต่อไปนี้
ทดสอบหนึ่ง
รับข้อมูลจากปุ่ม "ยืนยัน"
โดยปกติแล้วแบบฟอร์ม HTML ที่ส่งข้อมูลถึงคุณจะมีปุ่มยืนยันอยู่ในนั้น ตราบใดที่ปริมาณข้อมูลน้อยกว่า 49KB คุณก็สามารถทำได้
พิจารณาว่าฟิลด์ lpbData ใน TExetensionControlBlock พร้อมใช้งาน นี่คือวิธีที่คุณสามารถทำได้
ในกรณีส่วนใหญ่ ข้อมูลที่ส่งโดยตัวชี้ไปยังฟิลด์นี้จะได้รับ:
var
ส: สตริง;
เริ่ม
-
S := PChar(ECB.lpbData);
-
จบ;
หากข้อมูลที่มาจากฟิลด์นี้มีขนาดใหญ่กว่า 48KB คุณต้องเรียก ReadClient เพื่อรับข้อมูลที่เหลือ
หากคุณต้องการทราบว่ามีข้อมูลใดบ้างในช่อง lpbData คุณสามารถใช้สองฟังก์ชันต่อไปนี้เพื่อส่งข้อมูลกลับไปยังเว็บเบราว์เซอร์ของคุณ:
ฟังก์ชั่น SetUpResString: string;
เริ่ม
ผลลัพธ์ := ' +
-
-
'lpbData = %s ' +
-
จบ;
ฟังก์ชัน HttpExtensionProc (เป็น ECB: TExtensionControlBlock):
DWORD;
var
ResStr: สตริง;
StrLen: จำนวนเต็ม;
ส
S1: สตริง;
เริ่ม
ECB.lpszLogData := 'บันทึก Delphi DLL';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := รูปแบบ(ResStr
[ส]);
StrLen := ความยาว (ResStr);
ECB.WriteClient(ECB.ConnID
ตัวชี้(ResStr)
สเตรเลน
0);
ผลลัพธ์ := HSE_STATUS_SUCCESS;
จบ;
สมมติว่าคุณมีแบบฟอร์ม HTML พร้อมแนบโค้ดต่อไปนี้แล้ว:
รหัสนี้จะสร้างแบบฟอร์มพร้อมพื้นที่ข้อความให้คุณป้อนตัวเลขและปุ่ม "ส่ง" ที่เรียกว่า "GetSquare" หากคุณมีแบบฟอร์มนี้คุณสามารถคาดหวังได้ว่าทั้งสองโปรแกรมข้างต้นจะส่งคืนสตริงต่อไปนี้โดยสมมติว่าผู้ใช้ป้อนหมายเลข 23 ในพื้นที่ข้อความของแบบฟอร์ม:
lpbData = GetSquare=23&GetSquare=ส่ง
เพื่อให้เข้าใจถึงสิ่งที่เกิดขึ้นในขณะนี้ โปรดใส่ใจกับส่วนหลักของคำสั่ง HTML ที่ตัดตอนมาจากฟังก์ชันด้านบน
'lpbData = %s ' +
หากคุณศึกษาโค้ดในฟังก์ชัน HttpExtensionProc ด้านบน คุณจะพบว่าก่อนประโยคนี้ โค้ดจะใช้พารามิเตอร์ %s ในคำสั่ง Format แทนค่าใน ECB.lpbData (หากคุณไม่ทราบว่าคำสั่ง Format ทำงานอย่างไร โปรดดูเอกสารประกอบของ Delphi ที่เกี่ยวข้อง) [หมายเหตุ: ในสารานุกรมการเขียนโปรแกรม Delphi2 ของผู้เขียน (Delphi2
มีคำแนะนำโดยละเอียดในบทที่ 3 "ไฟล์สตริงและข้อความ" ใน Unleashed (นักแปล)]
สมมติว่าในแบบฟอร์มที่แสดงด้านบน เมื่อผู้ใช้กดปุ่ม "ยืนยัน" ค่าที่ส่งผ่านโดย lpbData ไปยัง ISAPI DLL คือ:
GetSquare=23&GetSquare=ส่ง
เพื่อให้คุณมีแนวคิดที่ชัดเจน ฉันขอย้ำอีกครั้งว่าข้อมูลที่ส่งกลับไปยังเบราว์เซอร์โดยสองคำสั่งข้างต้นคือสตริงต่อไปนี้ ซึ่งคุณได้เห็นแล้ว:
lpbData = GetSquare=23&GetSquare=ส่ง
วิธีที่ดีที่สุดในการดูกระบวนการนี้คือการทดสอบการรันโปรแกรม ISAPI2 ตามรายการด้านล่าง ISAPI2 คล้ายกับ ISAPI1 แต่มีฟังก์ชัน HttpExtensionProc ใหม่ที่แสดงด้านบน และยังมีฟังก์ชันยูทิลิตี SetUpResString ด้วย
ห้องสมุดIsapi2;
การใช้งาน
หน้าต่าง
SysUtils
HTTPExt;
ฟังก์ชัน GetExtensionVersion (var Ver: THSE_VERSION_INFO):
BOOL;
เริ่ม
Ver.dwExtensionVersion := $00010000; // รองรับ 1.0
Ver.lpszExtensionDesc := 'DLL ที่เขียนใน Delphi 2.0';
ผลลัพธ์ := จริง;
จบ;
ฟังก์ชั่น SetUpResString: string;
เริ่ม
ผลลัพธ์ := ' +
-
-
'lpbData = %s ' +
-
จบ;
ฟังก์ชัน HttpExtensionProc ( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
var
ResStr: สตริง;
StrLen: จำนวนเต็ม;
ส
S1: สตริง;
เลน: จำนวนเต็ม;
เริ่ม
ECB.lpszLogData := 'บันทึก Delphi DLL';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := รูปแบบ(ResStr
[ส]);
StrLen := ความยาว (ResStr);
ECB.WriteClient(ECB.ConnID
ตัวชี้(ResStr)
สเตรเลน
0);
ผลลัพธ์ := HSE_STATUS_SUCCESS;
จบ;
การส่งออก
รับส่วนขยายเวอร์ชัน
HttpExtensionProc;
เริ่ม
จบ.
เมื่อคุณได้รับข้อมูลที่ส่งผ่านโดยตัวแปร lpbData จากแบบฟอร์ม คุณสามารถแยกวิเคราะห์ข้อมูลหรือส่งคืนให้กับผู้ใช้ได้ ตัวอย่างเช่น คุณสามารถแยกตัวเลข 23 จากตัวอย่างด้านบน ยกกำลังสองแล้วส่งคืนให้ผู้ใช้ การทำเช่นนี้จะทำให้คุณได้รับข้อมูลจากผู้ใช้ ซึ่งในกรณีนี้คือตัวเลข ดำเนินการทางคณิตศาสตร์กับตัวเลข และสุดท้ายก็ส่งคืนผลลัพธ์ให้กับผู้ใช้ ซึ่งหมายความว่าคุณสามารถสร้างหน้าเว็บแบบโต้ตอบได้บนคลื่นวิทยุซึ่งเป็นลักษณะที่ได้รับความนิยมมากที่สุดของการเขียนโปรแกรมอินเทอร์เน็ตในขณะนี้!
ต่อไปนี้เป็นโค้ดโปรแกรมที่สมบูรณ์ซึ่งส่งกำลังสองของตัวเลขไปยังเบราว์เซอร์ผ่านเครือข่าย:
ห้องสมุด Isapi3;
{ รหัสนี้แสดงวิธีรับอินพุตจากผู้ใช้ผ่านเบราว์เซอร์
แยกวิเคราะห์ข้อมูลนั้น
แล้วตอบกลับผู้ใช้โดยเฉพาะ
ผู้ใช้ส่งหมายเลข
รหัสนี้กำลังสองมัน
แล้วส่งผลกลับไปยังผู้ใช้ นี่คือแบบฟอร์มจากเบราว์เซอร์ที่ส่งข้อมูลสำหรับการแยกวิเคราะห์:
-
การใช้งาน
หน้าต่าง
SysUtils
HTTPExt
StrBox;
ฟังก์ชัน GetExtensionVersion (var Ver: THSE_VERSION_INFO):
BOOL;
เริ่ม
Ver.dwExtensionVersion := $00010000; // รองรับเวอร์ชัน 1.0
Ver.lpszExtensionDesc := 'ISAPI3.DLL';
ผลลัพธ์ := จริง;
จบ;
// แยกวิเคราะห์ lpbData และดึงหมายเลขที่ผู้ใช้ส่งมาให้เรา
ฟังก์ชั่น ParseData (S: สตริง): จำนวนเต็ม;
เริ่ม
S := StripLastToken(S
-
S := StripFirstToken(S
-
ผลลัพธ์ := StrToInt(S);
จบ;
ฟังก์ชั่น SetUpResString: string;
เริ่ม
ผลลัพธ์ := ' +
-
-
'ตอบ = %d ' +
-
จบ;
ฟังก์ชัน HttpExtensionProc ( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
var
ResStr: สตริง;
StrLen: จำนวนเต็ม;
ส
S1: สตริง;
หมายเลข: จำนวนเต็ม;
เริ่ม
ECB.lpszLogData := 'บันทึก Delphi DLL';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
หมายเลข := ParseData(S);
จำนวน := Sqr(ตัวเลข);
ResStr := รูปแบบ(ResStr
[หมายเลข]);
StrLen := ความยาว (ResStr);
ECB.WriteClient(ECB.ConnID
ตัวชี้(ResStr)
สเตรเลน
0);
ผลลัพธ์ := HSE_STATUS_SUCCESS;
จบ;
การส่งออก
รับส่วนขยายเวอร์ชัน
HttpExtensionProc;
เริ่ม
จบ.
รหัสนี้ยอมรับสตริงต่อไปนี้จากผู้ใช้ที่กดปุ่มยืนยันและถามถึงหมายเลขกำลังสอง:
GetSquare=5&GetSquare=ส่ง
สมมติว่าอินพุตเช่นนี้โค้ดนี้จะส่งคืนสตริงต่อไปนี้ให้กับผู้ใช้ทางอินเทอร์เน็ต:
ตอบ = 25
ในหนึ่งประโยค ผู้ใช้ป้อนหมายเลข 5 และคุณส่งคืนหมายเลข 25 ให้กับผู้ใช้ หากผู้ใช้ส่งหมายเลข 10 คุณจะส่งคืนหมายเลข 100 สิ่งนี้อาจดูเล็กน้อย แต่สิ่งสำคัญคือสิ่งที่เกิดขึ้นบนอินเทอร์เน็ต [หมายเหตุ: หมายถึงหน้าเว็บแบบโต้ตอบ (แปลแล้ว
WHO)]
วิเคราะห์ฟังก์ชันที่ส่งผ่านโดยผู้ใช้ดังนี้:
// แยกวิเคราะห์ lpbData และดึงหมายเลขที่ผู้ใช้ส่งมาให้เรา
ฟังก์ชั่น ParseData (S: สตริง): จำนวนเต็ม;
เริ่ม
S := StripLastToken(S
-
S := StripFirstToken(S
-
ผลลัพธ์ := StrToInt(S);
จบ;
ข้อความทั้งสองนี้อยู่ในหน่วยที่กล่าวถึงในตอนต้นของบทความนี้และรวมอยู่ในเว็บไซต์ของฉันด้วย [หมายเหตุ: เอกสารนี้สามารถพบได้เกือบทุกที่บนอินเทอร์เน็ต
คุณสามารถขอได้จากนักแปล (นักแปล)][ในบทความนี้
ฉันแค่อยากจะพูดคุยเกี่ยวกับ ISAPI มาก นี่น่าจะเพียงพอที่จะสร้างแรงบันดาลใจให้คุณสนุกกับการใช้ประโยชน์จากเทคโนโลยีที่ยอดเยี่ยมนี้ ต่อไป ฉันต้องการพูดคุยเกี่ยวกับสองข้อความ GetServerVariable และ ReadClient ฉันได้ทำการทดลองที่จำกัดอย่างยิ่งในเรื่องนี้เท่านั้น ในบทความนี้ ฉันได้แนบไฟล์ HTTPEXT.PAS เพราะคุณจะไม่พบมันที่อื่นนอกจากเอกสารสำคัญนี้
คำสั่ง GetServerVariable และ ReadClient
เช่นเดียวกับการขอข้อมูลในแอปพลิเคชัน CGI ของคุณ คุณสามารถใช้คำสั่งเพื่อรับข้อมูลจากเซิร์ฟเวอร์ได้ นี่คือตัวอย่างการเรียกคำสั่งนี้:
เลน := HseMaxExtDllNameLen;
ความยาวชุด(S1
เลน);
ธ.ค.(เลน);
ECB.GetServerVariable(ECB.ConnID
'เนื้อหา_LENGTH'
พชาร์(S1)
เลน);
ขั้นแรก รหัสนี้จะกำหนดความยาวของบัฟเฟอร์ที่เก็บข้อมูลที่ดึงมาจากเซิร์ฟเวอร์ จากนั้นจะเรียกเซิร์ฟเวอร์และทำการร้องขอ ในกรณีนี้ จะถามถึง "CONTENT_LENGTH" ของข้อความจากเซิร์ฟเวอร์
เอกสารประกอบของ Microsoft บอกเราว่าคุณสามารถส่งสตริงต่อไปนี้เป็นพารามิเตอร์ที่สองของ GetServerVariable:
AUTH_TYPE ประกอบด้วยประเภทของการอนุญาตที่ใช้ ตัวอย่างเช่น หากคุณใช้การอนุญาตขั้นพื้นฐานอยู่
สตริงจะเป็น "พื้นฐาน" หากเป็นการตอบสนองต่อความท้าทายของ NT สตริงจะเป็น "NTLM" การอนุญาตอื่นๆ มีสตริงที่เกี่ยวข้องเฉพาะเจาะจง เนื่องจากมีการเพิ่มประเภทการอนุญาตใหม่ไปยังเซิร์ฟเวอร์อย่างต่อเนื่อง จึงไม่สามารถแสดงรายการสตริงที่เป็นไปได้ทั้งหมด หากสตริงว่างเปล่า จะไม่มีการใช้การให้สิทธิ์
CONTENT_LENGTH จำนวนไบต์ที่สคริปต์คาดว่าจะได้รับกลับจากไคลเอ็นต์
CONTENT_TYPE ประเภทเนื้อหาของข้อมูลที่ให้ไว้โดยเนื้อหาของคำขอโฆษณา [หมายเหตุ: น้องชายมีความสามารถน้อยกว่าและมีความรู้น้อยกว่าก
คำขอ POST ถูกแปลชั่วคราวเป็น "การแจ้งเตือนคำขอ" โปรดแก้ไขฉัน (นักแปล)]
PATH_INFO ข้อมูลเส้นทางเพิ่มเติม จัดทำโดยไคลเอ็นต์ มันมีเส้นทางไปยัง URL ตามชื่อสคริปต์
ขึ้นอยู่กับ. หากมีอยู่ จะอยู่หน้าสตริงคำขอ
path_translated นี่คือค่าของ path_info แต่มีชื่อของเส้นทางเสมือนทั้งหมดที่ขยายไปยังธงพา ธ
query_string ข้อมูลต่อไปนี้ "?" ใน URL ที่อ้างถึงสคริปต์นี้
remote_addr ที่อยู่ IP ของไคลเอนต์ที่ร้องขอหรือตัวแทน (ตัวอย่างเช่นเกตเวย์หรือไฟร์วอลล์)
รีโมท _host ชื่อโฮสต์ของไคลเอนต์ที่ร้องขอหรือตัวแทน (ตัวอย่างเช่นเกตเวย์หรือไฟร์วอลล์)
Remote_user นี้มีชื่อผู้ใช้ที่ไคลเอนต์ให้ไว้และได้รับอนุญาตจากเซิร์ฟเวอร์ หากสตริงเปล่าถูกส่งคืนผู้ใช้
ในชื่อของคุณ (แต่มีการอนุญาต)
unmapped_remote_user เป็นชื่อของผู้ใช้ที่มีคุณสมบัติต่อไปนี้: ผู้ใช้รายนี้ทำการร้องขอไปยังบัญชีผู้ใช้ NT (นี่คือตัวตนของเขา) ก่อนที่ตัวกรองแอปพลิเคชัน ISAPI แมปผู้ใช้
request_method เป็นวิธีการขอ HTTP
script_name ชื่อของสคริปต์ที่ดำเนินการ
server_name ที่อยู่โฮสต์หรือที่อยู่ IP เมื่อปรากฏใน URL อ้างอิงตนเอง
Server_port พอร์ต TCP/IP ที่รับคำขอ
server_port_secure สตริงที่เป็น 0 หรือ 1 มันคือ 1 เมื่อคำขอถูกจัดการโดยพอร์ตที่ปลอดภัย
Server_protocol ยอมรับชื่อและเวอร์ชันของข้อมูลโปรโตคอลที่เกี่ยวข้องกับคำขอนี้ มันมักจะเป็น http/1.0
Server_Software เป็นชื่อและเวอร์ชันของเว็บเซิร์ฟเวอร์ที่โปรแกรม Application DLL ของ Application ทำงาน all_http ตัวแปรก่อนหน้าไม่ได้แยกวิเคราะห์ส่วนหัว HTTP ทั้งหมด ตัวแปรเหล่านี้มาจาก http_ <ชื่อส่วนหัวของฟิลด์> ส่วนหัวของฟิลด์ (คั่นด้วยเครื่องหมายบรรทัด) มีแต่ละสตริงซึ่งไม่สิ้นสุด
http_accept กรณีพิเศษของส่วนหัวฟิลด์ HTTP ค่าที่ยอมรับคือ: ฟิลด์คั่นด้วยเครื่องหมายจุลภาค (,) ตัวอย่างเช่น: ถ้า
บรรทัดต่อไปนี้เป็นส่วนหนึ่งของส่วนหัว HTTP:
ยอมรับ: */ *, q = 0.1
จากนั้น URL (คุณสมบัติใหม่ในเวอร์ชัน 2.0) จะให้ส่วนพื้นฐาน
โปรดทราบว่าชิ้นส่วนข้อมูลที่ให้ไว้ข้างต้นจะถูกส่งผ่านโดยอัตโนมัติโดยบันทึก TextensionControlblock เพราะ
คุณไม่จำเป็นต้องโทรหา GetServerVariable สำหรับสิ่งนี้ อย่างไรก็ตามคุณสามารถโทรหาได้หากคุณต้องการโดยเฉพาะอย่างยิ่งหากคุณต้องการรับข้อมูลจาก ReadClient และจำเป็นต้องรู้ว่าจะอ่านข้อมูลได้มากแค่ไหน
หลายครั้งคุณไม่จำเป็นต้องโทรหา readclient อย่างไรก็ตามขนาดของข้อความที่ส่งโดยเบราว์เซอร์ของคุณมากกว่า 48KB
เวลาคุณต้องโทรหา readclient เพื่อรับข้อมูลที่เหลือ