Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
前陣子在協助客戶導入 Windows 2008 IIS 7.0 的時候,發現其實升級並不需要修改程式碼,只需要注意下列項目:
- 安裝 IIS 6 管理相容性項目 (IIS 6 Management Compatibility)
- COM 元件相容性
就可以很輕鬆的把 ASP 與 ASP.Net 的網站升級到 Windows 2008 + IIS 7.0
但升級的過程中碰到一個問題,我們發現 IIS 7.0 + ASP.Net 在顯示中文 Query string 的時候會造成亂碼 (????)。例如:
https://localhost/test.aspx?kw=中文
程式就是將使用者輸入的 Query String 顯示在網頁上,內容如下:
<%
Response.Write(Request("kw"))
%>
但是程式執行的結果是 ????
經過一番研究發現,只要將網站使用的應用程式集區 (App Pool) 的 Managed 管線模式 (Managed Pipeline Mode) 從原來預設的整合式改成傳統
並將網站的 .Net 全球化選項中的編碼要求改成 big5 (Windows 2008 中文版預設就是 big5 不需要修改)
這樣就可以正確的顯示中文的 Query String 到網頁結果中。
這個問題是可以解決沒錯,但是原因是甚麼卻百思不解,最後在 IIS.Net 的討論區上發問才由 IIS Team 的人員出來說這是 IIS 7.0 的 Bug Non english letters in request url:s is replaced with question mark。沒想到這麼明顯的錯誤居然是個 Bug,看起來是 ASP.Net 的整合式模組在處理 Non-Unicode 與 Unicode 編碼轉換時沒有考慮到 ANSI 編碼造成的問題。在修正程式出來之前,請大家在使用 IIS 7.0 + ASP.Net 的時候暫時不要使用整合式管線模式,請使用傳統的管線模式來避免中文 Query String 編碼的問題。
Comments
Anonymous
November 07, 2010
.Net 全球化選項我這邊試,是只有最後一個改成big5,其它照舊為utf-8耶。Anonymous
November 07, 2010
這個 bug 是 2008 年 Windows Server 2008 剛出來的時候才有的,後續的 Service Pack 和 R2 已經把這個問題解決了