14

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

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'


更新:

大多数类似的帖子都存在一个问题,即它们的 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,因为它说它是其他应用程序所必需的。
窗口\程序集

我也尝试过修改 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>

谢谢您的意见。我期待收到您的建议。

4

6 回答 6

10

令人满意的解决方案!

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

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

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

DLL 引用 + 别名

报告.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>


报告.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();
    }
}


参考来源:外部别名演练

于 2012-07-05T13:16:36.373 回答
5

我解决了我的问题,即从我的 Web.Config 中删除一个程序集在我的情况下,版本 10 和 11 结合在一起。我从 Config 中删除以下代码

 <add assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845DCD8080CC91"/>
于 2016-07-01T05:46:38.377 回答
1

这可能发生的另一个原因是如果您有嵌套的应用程序。IE。App1 内的 App2。

App1 的 web.config 可能会与 App2 混淆。确保它们没有引用同一程序集的不同版本。

于 2015-03-04T15:24:08.013 回答
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>


Ps:我无法将report.aspx中的html代码与reportviewer(aspx或cs)结合起来。我也不能通过使用在 aspx 中动态添加 ReportViewer<% AddRV(); %>


Pss Web.config 帮我解决了这些错误:

在远程模式下,报表查看器控件需要启用会话状态或在配置文件中指定报表服务器连接信息。


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

于 2012-07-03T08:02:04.273 回答
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>
于 2018-05-16T19:16:58.703 回答
-1

HKEY_CLASSES_ROOT\Installer\Assemblies\Global

通过右键单击该程序集并选择删除来搜索程序集并删除完整行。

于 2014-01-29T09:54:53.690 回答