เมื่อพูดถึงเนื้อหาของอ็อบเจ็กต์ Request หนึ่งในคอลเลกชันที่ต้องศึกษาคือคอลเลกชัน ServerVariables ชุดนี้ประกอบด้วยค่าผสมในส่วนหัว HTTP ที่ส่งจากไคลเอ็นต์ไปยังเซิร์ฟเวอร์พร้อมกับคำขอเพจ และค่าที่เซิร์ฟเวอร์ให้ไว้เมื่อได้รับการร้องขอ
ค่าที่ส่งคืนโดย
เพจ "การอ้างอิงตนเอง"
ในคอลเลกชัน ServerVariables ประกอบด้วยรายละเอียดของเว็บเซิร์ฟเวอร์และข้อมูลเส้นทางของเพจปัจจุบันข้อมูลนี้สามารถใช้ได้ทุกที่ที่คุณสร้างเพจ ตัวอย่างเช่น หากต้องการสร้างหน้า "การอ้างอิงตนเอง" ที่สามารถเรียกตัวเองอีกครั้งเพื่อทำงานอื่นให้สำเร็จ เราสามารถใช้โค้ดต่อไปนี้:
<FORM ACTION="<% = Request.ServerVariables("PATH_INFO") %><" METHOD= "POST ”>
สามารถรับเอฟเฟกต์เดียวกันนี้ได้ด้วยค่า HTTP “SCRIPT_NAME”:
<FORM ACTION="<% = Request.ServerVariables(“SCRIPT_NAME”) %><” METHOD="POST”>
ใช้องค์ประกอบ <A> เพื่อ เปิดหน้าอื่น คุณสามารถใช้:
...
-
strFullPath = Request.ServerVariables("PATH_INFO")
'ตัดชื่อไฟล์ออก
strPathOnly = ซ้าย(strFullPath, InStrRev(strFullPath, “/”))
strNextPage = strPathOnly & “หน้า/next_page.asp”
-
-
<A HREF=”<% = strNextPage %><”>หน้าถัดไป</A>
...
ตัวอย่างเหล่านี้ใช้ได้แม้ว่าชื่อหรือตำแหน่งของเพจเดิมจะเปลี่ยนไป เนื่องจากมีการใช้ข้อมูลพาธของเพจปัจจุบัน (แน่นอนว่า ตัวอย่างที่สองจะล้มเหลวเมื่อชื่อของเพจเป้าหมายที่แยกออกเปลี่ยนไป)
กล่าวอีกนัยหนึ่ง หาก URL ถูกสร้างขึ้นโดยอัตโนมัติสำหรับเซสชันย่อยของเครื่องมือค้นหา คุณสามารถรวบรวมค่าบางค่าของ ServerVariable ได้:
strFullURL = http:// & Request.ServerVariables("LOCAL_ADDR") _
& Cola & Request.ServerVariables("SERVER_PORT") _
& Request.ServerVariables("PATH_INFO")
สิ่งนี้จะสร้าง URL ที่สมบูรณ์รวมถึงหมายเลขพอร์ต (ในกรณีนี้ ไม่ใช่ค่ามาตรฐาน 80) ตัวอย่างเช่น ผลลัพธ์อาจเป็น:
http://194.74.60.254:1768/thispath/thispage.asp
การตรวจจับเวอร์ชันของเบราว์เซอร์
ค่าที่มีประโยชน์อีกประการหนึ่งในคอลเลกชัน ServerVariables คือสตริงตัวแทนผู้ใช้ของเบราว์เซอร์ของผู้ใช้ ในหน้า "การตรวจจับประเภทเบราว์เซอร์" (browsertype.asp) ค่า "HTTP_USER_AGENT" ในคอลเลกชัน ServerVariables จะถูกนำมาใช้เพื่อรับสตริงตัวแทนผู้ใช้
-
strUA = Request.ServerVariables("HTTP_USER_AGENT")
การตอบสนองเขียน “สตริง User Agent คือ <B><” & strUA & “</B>
-
ถ้า InStr(strUA, “MSIE”) แล้ว
ตอบกลับเขียน “หากต้องการอัปเกรดเบราว์เซอร์ของคุณ ให้ไปที่ “_
& “<A HREF=” & Chr(34) & http://www.microsoft.com/ie/ ”_
& Chr(34) & “> http://www.microsoft.com/ie/ <A>
-
intVersion = Cint(กลาง(strUA, InStr(strUA, “MSIE”) + 5, 1))
ถ้า intVersion >=4 แล้ว
ตอบกลับเขียน “คุณสามารถใช้ Microsoft Dynamic HTML”
สิ้นสุดถ้า
อื่น
ถ้า InStr(strUA, “Mozilla”) แล้ว
ถ้า InStr(strUA, “เข้ากันได้กับ;”) = 0 จากนั้น
การตอบสนองเขียน “เบราว์เซอร์ของคุณน่าจะเป็นนาวิเกเตอร์ คุณสามารถ “_
& “ดาวน์โหลด Navigator เวอร์ชันล่าสุดจาก “_
& “<A HREF=” & Chr(34) & http://home.netscape.com/ ”_
& “ดาวน์โหลด/”& Chr(34) & “> http://home.netscape.com ”_
& “/ดาวน์โหลด/</A>
-
intVersion = Cint(กลาง(strUA, InStr(strUA, “/”) +1, 1))
ถ้า intVersion >= 4 แล้ว
ตอบกลับเขียน “คุณสามารถใช้ Netscape Dynamic HTML ได้”
สิ้นสุดถ้า
อื่น
strVersion = กลาง (strUA, InStr (strUA, “เข้ากันได้;”) + 12)
strProduct = ซ้าย (strVersion, InStr (strVersion, “ “))
การตอบสนองเขียน “เบราว์เซอร์ของคุณเข้ากันได้กับ Navigator คุณทำได้”_
& “ค้นหาผู้ผลิตโดยใช้เครื่องมือค้นหา เช่น”_
& “<A HREF=" & Chr(34) _
& “http://www.altavista.digital.com/cgi-bin/query?q=”_
&strผลิตภัณฑ์_
& Chr(34) & “> http://www.altavista.com/ </A>
-
สิ้นสุดถ้า
สิ้นสุดถ้า
สิ้นสุดถ้า
%>
ผลการค้นหาสำหรับ IE 5.0 และ Navigator 4.61 จะแตกต่างกันตามลำดับ สำหรับเบราว์เซอร์จากผู้ผลิตรายอื่น คุณสามารถรับลิงก์เพื่อเริ่มค้นหาชื่อผู้ผลิตบนเว็บไซต์ Alta Vista โดยอัตโนมัติ
โปรดทราบว่า Netscape ไม่ได้ระบุชื่อของผู้ผลิตในสตริงตัวแทนผู้ใช้ ดังนั้นจึงไม่มีการรับประกันที่แน่นอนว่าเบราว์เซอร์คือ Navigator
การตรวจจับภาษาของเบราว์เซอร์
ค่าที่มีประโยชน์อีกค่าหนึ่งในคอลเลกชัน ServerVariables คือ "HTTP_ACCEPT_LANGUAGE" ซึ่งมีรหัสภาษาที่ระบุเมื่อมีการติดตั้งเบราว์เซอร์ หรือมีฮาร์ดโค้ดเป็นเวอร์ชันภูมิภาคของผู้ใช้ ตัวอย่างรหัสภาษา ได้แก่ en-us (สหราชอาณาจักร, US), de-at (เยอรมนี, ออสเตรเลีย) และ es-pe (สเปน, เปรู)
รหัสภาษาอาจเป็นรหัสทั่วไปและไม่ระบุตัวระบุภาษาถิ่น ตัวอย่างเช่น บนไซต์ Wrox ของเรา ผู้เยี่ยมชมจำนวนมากใช้ en (ภาษาอังกฤษ) เป็นรหัสภาษา
ดังนั้นจึงสามารถตรวจพบรหัสภาษาได้และโหลดเพจเวอร์ชันเฉพาะภูมิภาคหรือเฉพาะภาษาที่เหมาะสมโดยอัตโนมัติ
StrLocale = Lcase(ซ้าย(Request.ServerVariables("HTTP_ACCEPT_LANGUAGE"),2))
เลือกกรณี strLocale
กรณี “en”: Response.Redirect “http://uk_site.co.uk/”
กรณี “de”: Response.Redirect “http://de_site.co.de/”
กรณี “fr”: Response.Redirect “http://fr_site.co.fr/”
'...ฯลฯ
กรณีอื่น: Response.Redirect “http://us_sitel.com/”
สิ้นสุด เลือก
หรือเปลี่ยนเส้นทางเพจตามภาษาถิ่นเฉพาะ:
strLocale = Lcase(Request.ServerVariables("HTTP_ACCEPT_LANGUAGE"))
เลือกกรณี strLocale
กรณี “en-gb”: Response.Redirect “http://uk_site.co.uk/”
กรณี “en-us”: Response.Redirect “http://us_site.com/”
กรณี "es-pe": Response.Redirect "http://es_site2.co.pe/"
-
กรณีอื่น: Response.Redirect “http://us_site1.com/”
สิ้นสุดการเลือก
ค่าคอลเลกชัน ServerVariables ที่มีประโยชน์อื่น ๆ
สามารถเข้าถึงและใช้สมาชิกของคอลเลกชัน ServerVariables เพื่อควบคุมวิธีที่เพจ ASP ตอบสนองต่อคำขอ คุณสามารถตรวจสอบว่าผู้เยี่ยมชมเข้าถึงไซต์โดยใช้พอร์ตเริ่มต้น 80 หรืออย่างอื่น ในตัวอย่างนี้ ให้ค้นหาการเข้าถึงผ่านพอร์ต 443 ซึ่งให้การเข้าถึง Secure Socket Layer (SSI) (และโปรโตคอลอื่นๆ) และเปลี่ยนเส้นทางไปยังหน้าที่เหมาะสม
ถ้า Request.ServerVariables("SERVER_PORT") = "443") จากนั้น
Response.Redirect "/securesite/default.asp" 'ผู้ใช้ที่ปลอดภัย
อื่น
Response.Redirect “/normalsite/default.asp” 'ผู้ใช้ที่ไม่ปลอดภัย
สิ้นสุด หาก
เบราว์เซอร์จำเป็นต้องลงทะเบียนและตรวจสอบโดยเซิร์ฟเวอร์ (แทนที่จะอนุญาตให้เข้าถึงโดยไม่ระบุชื่อภายใต้บัญชี IUSER ของเว็บเซิร์ฟเวอร์ ปัญหานี้จะมีการกล่าวถึงโดยละเอียดในบทต่อๆ ไป) ชื่อผู้ใช้สามารถเป็นได้ สอบถามเพื่อระบุผู้ใช้ที่กำลังติดต่อกับเรา เป็นใคร และจะโหลดหน้าเว็บให้กับผู้ใช้รายนี้หรือไม่ ตัวอย่างเช่น รหัสต่อไปนี้จะแสดงเฉพาะลิงก์การดูแลระบบให้กับผู้ใช้ที่ชื่อผู้ดูแลระบบเท่านั้น
-
<A HREF=”dispcnfg.asp”><เปลี่ยนการกำหนดค่าการแสดงผล</A>
<A HREF=”dispcolr.asp”>เปลี่ยนสีของจอแสดงผล</A>
<A HREF=”keyboard.asp”>เปลี่ยนการกำหนดค่าแป้นพิมพ์</A >
<%
ถ้า Request.ServerVariables("AUTH_USER") _
= Ucase(Request.ServerVariables(“SERVER_NAME”)) & “Administrator” จากนั้น
-
<A HREF=”allusers.asp”">ดูแลระบบผู้ใช้ทั้งหมด</A>
<A HREF=”usrlogon.asp”>ดูแลข้อมูลการเข้าสู่ระบบ </A>
-
สิ้นสุดถ้า
-
...
โปรดทราบว่า ASP จะไม่กรอกคอลเลกชัน ServerVariables จนกว่าคุณจะเข้าถึงสมาชิกคนใดคนหนึ่ง การเข้าถึงสมาชิกของคอลเลกชันนี้เป็นครั้งแรกจะทำให้ IIS ได้รับข้อมูลทั้งหมด คอลเลกชัน ServerVariables ควรใช้เมื่อจำเป็นเท่านั้น
เทคนิคการร้องขอและการตอบกลับอื่นๆ
ตอนนี้เรามาดูเทคนิคที่เป็นประโยชน์บางประการสำหรับการใช้ออบเจ็กต์การร้องขอและการตอบกลับ รวมถึง:
· การจัดการการเชื่อมต่อ การบัฟเฟอร์ และการเปลี่ยนเส้นทางเพจ
· การทำงานของส่วนหัว HTTP การแคช และหน้า "หมดอายุ"
·ใช้ใบรับรองไคลเอ็นต์
· สร้างข้อความไฟล์บันทึกที่กำหนดเอง
1. การจัดการการเชื่อมต่อ การบัฟเฟอร์ และการเปลี่ยนเส้นทางหน้า
คุณลักษณะที่มีประโยชน์มากของ ASP คือการช่วยให้ผู้ใช้สามารถเปลี่ยนเส้นทางจากหน้าเว็บ ASP หนึ่งไปยังหน้าเว็บอื่น (ASP หรือ HTML) หรือไปยังไฟล์ต้นฉบับอื่น (เช่นไฟล์ ZIP หรือข้อความ ไฟล์) ). สิ่งนี้มีความโปร่งใสต่อผู้ใช้ จริงๆ แล้วมันเป็นเบราว์เซอร์ที่ใช้งานได้ เมื่อใช้วิธีการ Response.Redirect เพื่อโหลดเว็บเพจใหม่ ส่วนหัว HTTP พิเศษจะถูกส่งกลับไปยังไคลเอนต์จริงๆ ส่วนหัวนี้คือ:
HTTP/1.1 302 Object Moved
ตำแหน่ง /newpath/newpage.asp
เบราว์เซอร์จะอ่านข้อมูลส่วนหัวนี้ และโหลดเพจตามที่กำหนดโดยค่าตำแหน่ง ฟังก์ชันนี้เหมือนกับการใช้แท็ก HTML ฝั่งไคลเอ็นต์ <META> ในเว็บเพจ ตัวอย่างเช่น:
<META HTTP-EQUIV="REFRESH" CONTENT="0;URL=/newpath/newpage.asp">
ซึ่งจะนำ ปัญหาคือพร็อกซีเซิร์ฟเวอร์ระหว่างเซิร์ฟเวอร์และผู้ใช้อาจจัดเตรียมข้อความของตัวเองที่มีลิงก์ไปยังหน้าใหม่ แทนที่จะโหลดหน้าใหม่โดยตรง และเบราว์เซอร์อาจทำงานเหมือนกันทั้งนี้ขึ้นอยู่กับผู้ผลิตและเวอร์ชัน วิธีนี้จะลบความโปร่งใสที่คาดไว้ออก และทำให้การเข้าถึงไซต์ของคุณยุ่งยากมากขึ้นสำหรับผู้ใช้ เนื่องจากพวกเขายังคงได้รับข้อความแสดงข้อผิดพลาดต่อไป
หลังจากส่งเนื้อหาหน้าใดๆ เช่น ข้อความหรือ HTML แล้ว เราจะไม่สามารถใช้วิธี Redirect ได้อีกต่อไป อย่างไรก็ตาม วิธีหนึ่งที่ดูเหมือนจะจำกัด "ผลกระทบของพร็อกซีเซิร์ฟเวอร์" คือต้องตรวจสอบให้แน่ใจก่อนว่าจะไม่มีการส่งข้อมูลเอาต์พุต (รวมถึงส่วนหัว HTTP) ไปยังไคลเอ็นต์ ใน ASP 2.0 คุณต้องเปิดบัฟเฟอร์แล้วใช้เมธอด Clear เพื่อล้างบัฟเฟอร์:
Response.Buffer = True
'เงื่อนไขบางประการในการเลือกหน้าที่เหมาะสม:
ถ้า Request.ServerVariables("SERVER_PORT") = 1856 แล้ว
StrNewPage = “/newpath/this_page.asp”
อื่น
StrNewPage = “/newpath/the_other_page.asp”
สิ้นสุดถ้า
การตอบสนองชัดเจน
Response.Redirect strNewPage
ใน ASP 3.0 การบัฟเฟอร์จะถูกเปิดใช้งานตามค่าเริ่มต้น ดังนั้นจึงสามารถละเว้นบรรทัดแรกได้ แต่จะไม่เป็นอันตรายและทำให้มั่นใจได้ว่าหน้าเว็บของเราจะยังคงทำงานแม้ในสภาพแวดล้อม ASP 2.0
แทนที่จะใช้การเปลี่ยนเส้นทางส่วนหัว HTTP ประเภทนี้ ควรใช้คุณลักษณะใหม่ของ ASP 3.0 ซึ่งช่วยให้เราสามารถแปลงเพื่อดำเนินการหน้าเว็บอื่นผ่านวิธีการถ่ายโอนของวัตถุเซิร์ฟเวอร์ เราจะศึกษาปัญหานี้เพิ่มเติมในอนาคต .
1) บัฟเฟอร์หน้า ASP
ดังที่คุณเห็นแล้ว บัฟเฟอร์หน้า ASP 3.0 จะถูกเปิดใช้งานตามค่าเริ่มต้นใน IIS 5.0 และปิดโดยค่าเริ่มต้นในเวอร์ชันก่อนหน้า Microsoft แจ้งเราว่าการบัฟเฟอร์ทำให้การจัดส่งหน้าเว็บมีประสิทธิภาพมากขึ้นใน IIS 5.0 ซึ่งเป็นสาเหตุที่ทำให้สถานะเริ่มต้นของการบัฟเฟอร์มีการเปลี่ยนแปลง ในกรณีส่วนใหญ่ สิ่งนี้ไม่มีผลกระทบต่อเรา อย่างไรก็ตาม หากคุณมีหน้าเว็บที่มีขนาดใหญ่มาก หรือหน้าเว็บที่ใช้เวลาสักครู่ในการสร้างโดยใช้ ASP หรือโค้ดและส่วนประกอบฝั่งเซิร์ฟเวอร์อื่นๆ เมื่อส่วนประกอบต่างๆ เสร็จสมบูรณ์ เราสามารถรีเฟรชหน้าเว็บเหล่านั้นเป็นชุดไปยังไคลเอนต์ได้:
.. .
... โค้ดสำหรับสร้างส่วนแรกของเพจ
-
การตอบสนองฟลัช
-
... โค้ดสำหรับสร้างส่วนถัดไปของหน้า
-
การตอบสนองฟลัช
...
บางครั้งคุณอาจต้องการหยุดการเรียกใช้โค้ด ณ จุดใดจุดหนึ่งก่อนสิ้นสุดหน้า โดยการเรียกเมธอด End เพื่อรีเฟรชเนื้อหาปัจจุบันทั้งหมดไปยังไคลเอนต์ และยกเลิกการประมวลผลเพิ่มเติม
-
... โค้ดสำหรับสร้างส่วนแรกของเพจ
ถ้า strUserName = "" จากนั้น Response.Clear
-
... โค้ดสำหรับสร้างเวอร์ชันใหม่ของเพจในส่วนนี้
...
ต่อไปนี้คือตัวอย่างหน้าเว็บสองหน้าที่แสดงการบัฟเฟอร์และการเปลี่ยนเส้นทาง ซึ่งสามารถดาวน์โหลดได้จากหน้าหลัก "Response Object" (sow_response.asp) เว็บเพจตัวอย่าง Response.Redirect แรกชื่อ เปลี่ยนเส้นทาง.asp โดยแทรกเนื้อหาบางส่วนลงในเพจที่บัฟเฟอร์ ล้างบัฟเฟอร์ และเปลี่ยนเส้นทางไปยังเว็บเพจอื่น:
สำหรับ intLoop = 1 ถึง 1000000
ตอบกลับเขียน "."
ต่อไป
การตอบสนองชัดเจน
Response.Redirect "show_redirect.asp"
Response.End
show_response.asp ทำงานเดียวกัน แต่การเปลี่ยนเส้นทางกลับไปที่โฮมเพจ "วัตถุการตอบสนอง" เนื่องจากเพจเหล่านี้ถูกบัฟเฟอร์และเอาต์พุตทั้งหมดต้องถูกล้างก่อนที่จะเปลี่ยนเส้นทาง จึงไม่มีเอาต์พุตที่มองเห็นได้ในเบราว์เซอร์ อย่างไรก็ตาม คุณสามารถดูการเปลี่ยนเส้นทางแต่ละครั้งที่เกิดขึ้นได้โดยการสังเกตสถานะของเบราว์เซอร์ ดังแสดงในรูปด้านล่าง:
<img src=/u/info_img/2009-06/25/asp14.jpg>
ในหน้าแรกของ "Response Object" คลิกลิงก์ "Response.Flush" เพื่อเปิดหน้าเว็บตัวอย่างที่สอง usebuffer.asp มันจะวนซ้ำอักขระแต่ละตัวของสตริงและล้างข้อมูลเหล่านั้นไปยังไคลเอนต์ด้วยความล่าช้าบางอย่าง แม้ว่านี่จะเป็นการใช้เว็บเซิร์ฟเวอร์และ ASP ที่ไม่มีประสิทธิภาพมาก
<img src=/u/info_img/2009-06/25/asp15.jpg>
ต่อไปนี้เป็นรหัส ASP ขั้นต่ำที่จำเป็น โปรดทราบว่าเรารีเฟรชอักขระแต่ละตัวในเบราว์เซอร์แยกกัน เพราะไม่เช่นนั้นจะถูกเก็บไว้ในบัฟเฟอร์จนกระทั่ง หน้าเว็บเสร็จสมบูรณ์:
strText = “ข้อความนี้ถูกล้างไปยังเบราว์เซอร์โดยใช้ “ & _
"<B>การตอบสนองฟลัช</B>
-
สำหรับ intChar =1 ถึง Len(strText)
สำหรับ intWrite = 1 ถึง 100,000
ต่อไป
Response.Write Mid(strText,intChar,1)
การตอบสนองฟลัช
ถัดไป
) คุณสมบัติ Response.IsClientConnected
คุณสมบัติ IsClientConnected มีอยู่แล้วใน ASP 2.0 แต่ค่อนข้างไม่น่าเชื่อถือ ต้องส่งเอาต์พุตบางส่วนไปยังไคลเอนต์ก่อนที่จะส่งคืนผลลัพธ์ที่แม่นยำ ปัญหานี้ได้รับการแก้ไขแล้วใน ASP 3.0 คุณสมบัตินี้สามารถใช้งานได้อย่างอิสระแล้ว
IsClientConnected เป็นวิธีที่มีประโยชน์ในการสังเกตว่าผู้ใช้ยังคงเชื่อมต่อกับเซิร์ฟเวอร์และโหลดหน้าเว็บที่สร้างโดย ASP หรือไม่ หากผู้ใช้ยกเลิกการเชื่อมต่อหรือหยุดดาวน์โหลด เราไม่ต้องเปลืองทรัพยากรเซิร์ฟเวอร์ในการสร้างหน้าเว็บอีกต่อไป เนื่องจากเนื้อหาบัฟเฟอร์จะถูกยกเลิกโดย IIS ดังนั้นสำหรับหน้าเว็บที่ต้องใช้เวลามากในการคำนวณหรือใช้ทรัพยากรจำนวนมากจึงควรตรวจสอบในทุกขั้นตอนว่าเบราว์เซอร์ออฟไลน์หรือไม่:
...
... โค้ดสำหรับสร้างส่วนแรกของเพจ
-
ถ้า Response.IsClientConnected แล้ว
การตอบสนองฟลัช
อื่น
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
-
... โค้ดสำหรับสร้างส่วนถัดไปของหน้า...