我的asp.net網站從Windows2000移到Windows2008後,有一個使用ReportViewer的程式一直出現JScript Error "RSClientController is undefined",然後畫面完全沒出來,我一直以為是又是IE8的問題,因為先前使用的FreeTextBox在某個網站無法使用,Google找到原因了~
1. http://casear.blogspot.com/2008/10/rdlc-in-iis7.html
2. http://ericphan.info/blog/2008/12/8/reservedreportviewerwebcontrolaxd-not-found.html
3. http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/02/02/reportviewer-2008-on-iis7.aspx
其中黑暗執行緒提到
背後真正的問題是這樣的,Visual Studio 2008在你拖入ReportViewer時會自動在web.config的system.web中加入HttpHandler Mapping:
<add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false" />
但問題來了,在IIS7上ASP.NET有兩種執行模式,Classic Mode及Integrated Mode,web.config裡HttpHandler等設定也變成有兩區,system.web是給Classic Mode用的,system.webServer是給Integrated Mode用的。
VS2008自動加入HttpHandler設定只改了system.web區(大概是因為IIS7比VS2008晚發展),卻沒一併在system.webServer區新增設定,而我的WebApp設定是用Integrated Mode執行,這下子等於沒註冊Reserved.ReportViewerWebControl.axd,自然以HTTP 404收場。
前述文章中開啟IIS管理UI加入HttpHandler Mapping的動作,背後便是在system.webServer加入以下的HttpHandler設定:
<add name="Reserved-ReportViewerWebControl-axd" path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" resourceType="Unspecified" preCondition="integratedMode" />
我看我的web.config裡面在<system.web>的<httpHandlers>是
<add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>
所以在<system.webServer>的<handlers>加上
<add name="Reserved-ReportViewerWebControl-axd" path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" resourceType="Unspecified" preCondition="integratedMode" />
當然也可以在IIS7加上,但只能擇一如下
· 要求的路徑 Reserved.ReportViewerWebControl.axd
· 類型: Microsoft.Reporting.Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
· 名稱: Reserved-ReportViewerWebControl-axd
這樣就沒問題了~