如何在web.config中添加不同版本ReportViewerWebControlHandler并解决异常
解决ReportViewer 11与15版本Handler共存冲突问题
问题根源很明确:你添加的两个Handler用了完全相同的path(Reserved.ReportViewerWebControl.axd),IIS处理请求时会按配置顺序匹配,这就导致依赖不同版本的系统抢同一个路由,一会儿15版本的Handler接管请求,一会儿11的,来回冲突才会出现时好时坏、其他系统失效的情况。
下面给你几个可行的解决方案:
方案1:用不同路径区分两个版本的Handler
给15版本的Handler设置独有的path,比如Reserved.ReportViewerWebControlV15.axd,这样不同系统可以各自调用对应版本的路由。
修改后的web.config handlers配置:
<system.webServer> <handlers> <!-- 适配版本11的Handler --> <add name="ReportViewerWebControlHandler" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/> <!-- 适配版本15的Handler,使用独立路径 --> <add name="ReportViewerWebControlHandlerV15" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControlV15.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/> </handlers> </system.webServer>
同时,在使用ReportViewer 15的页面里,需要指定这个新的Handler路径:
在ASPX页面的ReportViewer控件中添加ReportViewerHandlerUrl属性:
<rsweb:ReportViewer ID="ReportViewer1" runat="server" ReportViewerHandlerUrl="Reserved.ReportViewerWebControlV15.axd"> <!-- 其他控件配置 --> </rsweb:ReportViewer>
方案2:用应用程序池隔离不同版本的系统
如果你的两个系统可以分开部署,给依赖ReportViewer 11的系统和依赖15的系统分配独立的IIS应用程序池,各自的web.config里只配置对应版本的Handler,从根源上避免同一个配置文件里的Handler冲突。
方案3:配置程序集绑定重定向(同应用共存场景)
如果必须在同一个应用里同时加载两个版本的ReportViewer程序集,需要在web.config的<runtime>节点下添加程序集绑定重定向,确保两个版本的dll都能被正确识别:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.ReportViewer.WebForms" publicKeyToken="89845dcd8080cc91" culture="neutral"/> <!-- 如果需要同时保留两个版本,用codeBase指定各自dll的路径 --> <codeBase version="11.0.0.0" href="bin/Microsoft.ReportViewer.WebForms.11.dll"/> <codeBase version="15.0.0.0" href="bin/Microsoft.ReportViewer.WebForms.15.dll"/> </dependentAssembly> </assemblyBinding> </runtime>
注意:要确保两个版本的dll都放在指定的bin路径下,且应用程序池有访问权限。
额外注意事项
- 绝对不要让两个Handler用相同的
path,这是冲突的核心原因。 - 两个Handler的
preCondition都设为integratedMode,确保运行环境一致,避免模式不兼容导致的异常。 - 每次修改web.config后,重启对应的应用程序池,确保配置完全生效,不要依赖IIS的自动重启。
内容的提问来源于stack exchange,提问作者hey hej
相关产品推荐
相关产品推荐

