C#:类型'Microsoft.Reporting.WebForms.ReportViewer'存在于ReportingServicesWebUserInterface.dll和Microsoft.ReportViewer.WebForms.dll中

时间:2012-06-27 14:11:44

标签: asp.net reporting-services reportviewer

搜索了很多类似的帖子,解决方法后,我决定自己发帖。

Compilation Error

Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. 

Compiler Error Message: CS0433: 
The type
    'Microsoft.Reporting.WebForms.ReportViewer' 
exists in both 
    'c:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\reportmanager\Bin\ReportingServicesWebUserInterface.dll'
and
    'c:\WINDOWS\assembly\GAC_MSIL\Microsoft.ReportViewer.WebForms\9.0.0.0__b03f5f7f11d50a3a\Microsoft.ReportViewer.WebForms.dll'


更新

大多数similair帖子的问题是他们的2个冲突的DLL有8.0.0.0和9.0.0.0版本左右。或者它们位于TEMPORARY文件夹中。我不认为我的问题可以通过此类帖子类似地解决。

在我们的ReportServer上有一个Report.aspx,它呈现一个报告。我想用我自己的文件替换这个文件,修改页面布局,如下所示:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Report.aspx.cs" Inherits="WebApplication._Default" %>

<%@ Register 
    Assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    Namespace="Microsoft.Reporting.WebForms"
    TagPrefix="rsweb" %>

<!DOCTYPE>
<html>
    <head runat="server"></head>
    <body>
        <div>
            <form id="reportform" runat="server">
                <div>
                    <rsweb:ReportViewer
                        ID='ReportViewerRoot'
                        runat='server'
                        ProcessingMode='Remote'
                        Height='100%'
                        Width='100%'
                        AsyncRendering='False'
                        SizeToReportContent='True'
                    />
                </div>
            </form>
        </div>
    </body>
</html>

这需要引用MS.ReportViewer.WebForms.DLL

我的Project.csproj文件包含:

<Reference Include="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />

我无法卸载C:\ WINDOWS中的任何DLL,因为它说它是其他应用程序所必需的。
WINDOWS\assembly

我还尝试修改web.config,添加一些dependentAssemnly,但不确定什么是有用的(它对上面提到的版本差异很有用)。

此外,我在web.config中有这些行:

<compilation defaultLanguage="c#" debug="false" tempDirectory="C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\RSTempFiles\">
    <assemblies>
        <clear />
        <add assembly="ReportingServicesWebServer" />
    </assemblies>
</compilation>

感谢您的投入。 我期待收到你的建议。

6 个答案:

答案 0 :(得分:10)

满意的解决方案!

在aspx中插入ReportViewer对象时,会自动添加DLL引用(并指向 GAC WebForms )。我需要这个引用(无法成功手动引用GAC DLL),然后我删除了aspx中的ReportViewer。另外,我添加了对冲突的DLL ReportingServicesWebUserInterface.DLL 的引用。这会将问题(从post发送错误)移至VS,而不是仅在SSRS服务器上。

添加新的ReportViewer()时,我会在VS中收到错误。

解决方案如下:给不需要的DLL一个别名(实际上没有在代码中使用它)。这将告诉编译器在使用WebForms时不使用此DLL。见图片

DLL references + alias

Report.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Report.aspx.cs" Inherits="MyWebApplication._Default" %>

<!DOCTYPE>

<html>
<head runat="server">
    <title></title>
</head>
<body>
    <div>
    <div style="background-color:Red;width:100px;height:100px;">Hoi</div>
    </div>
    <form id="formID" runat="server">
    test
    </form>
    <div>haha</div>
</body>
</html>


Report.aspx.cs

public partial class _Default : System.Web.UI.Page
{
    ReportViewer ReportViewerRoot;

    protected void Page_Load(object sender, EventArgs e)
    {
        AddRV();
    }

    public void AddRV()
    {
        ReportViewerRoot = new ReportViewer()

        formID.Controls.Add(ReportViewerRoot);

        SetReportViewer();
        SetServerReport();
    }

    public void SetReportViewer()
    {
        ReportViewerRoot.ID = "ReportViewerRoot";
        ReportViewerRoot.ProcessingMode = ProcessingMode.Remote;
    }

    private void SetServerReport()
    {
        ServerReport serverReport = ReportViewerRoot.ServerReport;

        // Set the report server URL and report path
        serverReport.ReportServerUrl = new Uri("http://localhost/reportserver");
        serverReport.ReportPath = Request.QueryString["ItemPath"];
        serverReport.Refresh();
    }
}


参考来源:Extern alias walkthrough

答案 1 :(得分:1)

我解决了我的问题 从我的Web.Config中删除一个程序集 在我的案例中,版本10和11汇集在一起​​。 我从Config中删除了下面的代码

 <add assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845DCD8080CC91"/>

答案 2 :(得分:0)

不在这个答案中,但在下一个答案中我已经提出了令人满意的解决方案!! :)


这个解决方案确实有效,但在开发周期/可读性/可维护性方面并不令人满意。


我的Report.aspx文件只包含这一行:

<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="Report.aspx.cs" Inherits="WebApplication._Default" %>


我的Report.aspx.cs确实包含如下代码:

        HtmlGenericControl body = new HtmlGenericControl();
        HtmlForm form = new HtmlForm();
        ReportViewerRoot = new ReportViewer();

        Controls.Add(body);
        body.Controls.Add(form);
        form.Controls.Add(ReportViewerRoot);


我的ReportManager / Web.config包含其他标记:

<!-- added enableSessionState -->
<pages validateRequest="false" enableSessionState="true" />

<httpModules>
    <clear />
    <!-- added -->
    <add name="Session"  type="System.Web.SessionState.SessionStateModule"/>
</httpModules>

<httpHandlers>
    <!-- added -->
    <add verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</httpHandlers>


P.S: 我无法将report.aspx中的html代码与reportviewer(aspx或cs)结合起来。 我也不能使用<% AddRV(); %>

在aspx中动态添加ReportViewer


P.s.s. Web.config帮助我解决了这些错误:

  

在远程模式下,Report Viewer控件需要启用会话状态或在中指定Report Server连接信息   配置文件。


  

报表查看器Web控件HTTP处理程序尚未在应用程序的web.config文件中注册。添加到system.web / httpHandlers   web.config文件的一部分。

答案 3 :(得分:0)

转到

HKEY_CLASSES_ROOT \安装\装配\全球

搜索程序集并右键单击该行并删除完整行,然后选择“删除”。

答案 4 :(得分:0)

如果您有嵌套的应用程序,也可能出现这种情况。即。 App1内的App2。

App1的web.config可能会破坏App2的功能。确保他们没有引用同一个程序集的不同版本。

答案 5 :(得分:0)

在web.config中包含一个标签dependentAssembly以强制使用特定版本:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     <dependentAssembly>
        <assemblyIdentity name="Microsoft.ReportViewer.WebForms" publicKeyToken="89845dcd8080cc91" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="14.0.0.0" />
      </dependentAssembly>