最近写一项目用到微软的PeportView控件,本地调试正常且Pass,但发部署到服务器上就会出现问题,在MSDN上找到解决方案:
环境Windows 2008,用Visual Studio 2008开启在IIS7上的现有Web Site,新增一个WebForm.aspx,从工具箱拖入ReportViewer,按控件右上角的Report Wizard随意做了一个ObjectDataSource,一切看来顺利得很,但一检视网页,喷出一堆Javascript错误: (共22个,底下列了几个)
RSClientController is not defined
ReportViewerHoverButton is not defined
document.getElementById("ReportViewer1_ctl01_ctl01_ctl00_ctl00").Controller is undefined
document.getElementById("ReportViewer1").ClientController is undefined
ReportViewerLink is not defined
用Firebug一查,原来网页中引用很多类似Reserved.ReportViewerWebControl.axd?OpType=Resource&Version=9.0.30729.1&Name=Microsoft.Reporting.WebForms.Scripts.ReportViewer.js的URL,用来载入控件所需的JS、图档等等,但全部传回HTTP 404,以找不到档案收场,看来是Reserved.ReportViewerWebControl.axd这个HttpHandler没被正确地注册所致。
Google到一篇不错的文章,依着提示摸索一番(但文中"2.Type: Microsoft.Reporting.Microsoft.Reporting.WebForms.HttpHandler, ...."误写了多余的Microsoft.Reporing,应为Microsoft.Reporting.WebForms.HttpHandler才正确,被这个笔误给搅和了一阵子),总算把问题解决了。
背后真正的问题是这样的,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" />
浙公网安备 33010602011771号