小卡Ivan

/~↘已经踏上了编码生涯,从一本流年到Hello World,这世界便已经开始有了色彩!!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

关于Reportviewer部署到服务器的问题

Posted on 2012-05-19 10:45  小卡Ivan  阅读(2087)  评论(0)    收藏  举报

最近写一项目用到微软的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.jsURL,用来载入控件所需的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.configsystem.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" />

但问题来了,在IIS7ASP.NET有两种执行模式,Classic ModeIntegrated Modeweb.configHttpHandler等设定也变成有两区,system.web是给Classic Mode用的,system.webServer是给Integrated Mode用的。

 VS2008自动加入HttpHandler设定只改了system.web(大概是因为IIS7VS2008晚发展),却没一并在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" />