0

好吧,我已经尝试了很多东西来解决这个问题,但没有一个。

我开发了一个报告服务(2005)并部署了它。

这份报告将被每个访问在框架 3.5 上开发的网站(它是一个互联网站点,因此不会被 Intranet 访问)的人使用(但我认为框架的版本不是问题的根源)。

当用户单击按钮下载报告自动生成的 .pdf 文件时(最终用户永远不会看到报告的 html 版本),它会要求提供 Windows 凭据。

如果用户输入一个有效的凭证(并且这个凭证必须是部署报告服务的服务器上的一个有效凭证),那么 .pdf 显然会被下载。

但这不可能发生。最终用户必须直接下载 .pdf,而不要求提供凭据。毕竟,他连证件都没有。

Response.Redirect("http://MyServer/ReportServer/Pages/ReportViewer.aspx?%2fReportLuiza%2fReportContract&rs:Format=PDF&NMB_CONTRACT=" + txtNmbContractReport.Text);

上面的代码片段显示了用户单击按钮时我的代码的第一个版本。这是 Windows 凭据的提示。

我已经尝试在 IIS 上更改虚拟目录 ReportServer 的身份验证,但唯一有效的是 Windows 凭据。其他的甚至不让我打开报表的虚拟目录或报表管理器的虚拟目录。

当我尝试将其更改为匿名身份验证时,他无法访问数据库。然后我选择将凭据安全存储在报表服务器上的选项。还是不行。

我的 ReportServer 虚拟目录的物理目录指向硬盘上的报告服务器文件夹 (C:\Program Files\Microsoft SQL Server\MSSQL.5\Reporting Services\ReportServer)。我将同一个文件夹移动到我的 wwwroot 目录。没用。虚拟目录甚至没有打开。然后我读到这可能是一个问题,因为我在两个文件夹中有相同的名称(一个在 C: 中,另一个在 wwwroot 中)。所以我在wwwroot中更改了一个名称。无法完成数据库连接的相同问题。我返回了 C 的物理路径:

下面是我的按钮事件代码的第二个版本:

ReportExecutionService rs = new ReportExecutionService();
        rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
        rs.Url = "http://MyServer/ReportServer/ReportExecution2005.asmx";

        // Render arguments
        byte[] result = null;
        string reportPath = "/ReportLuiza/ReportContract";
        string format = "PDF";

        // Prepare report parameter.
        ParameterValue[] parameters = new ParameterValue[1];
        parameters[0] = new ParameterValue();
        parameters[0].Name = "NMB_CONTRACT";
        parameters[0].Value = txtNmbContractReport.Text;

        string encoding;
        string mimeType;
        string extension;
        Warning[] warnings = null;
        string[] streamIDs = null;

        ExecutionInfo execInfo = new ExecutionInfo();
        ExecutionHeader execHeader = new ExecutionHeader();

        rs.ExecutionHeaderValue = execHeader;

        execInfo = rs.LoadReport(reportPath, null);

        rs.SetExecutionParameters(parameters, "pt-br");
        String SessionId = rs.ExecutionHeaderValue.ExecutionID;

        try
        {
            result = rs.Render(format, null, out extension, out encoding, out mimeType, out warnings, out streamIDs);

            execInfo = rs.GetExecutionInfo();
        }
        catch (SoapException se)
        {
            ShowMessage(se.Detail.OuterXml);
        }

        // Write the contents of the report to an pdf file.
        try
        {
            using (FileStream stream = new FileStream(@"c:\report.pdf", FileMode.Create, FileAccess.ReadWrite))
            {
                stream.Write(result, 0, result.Length);
                stream.Close();
            }
        }
        catch (Exception ex)
        {
            ShowMessage(ex.Message);
        }

对于此代码,我必须将 WebReference 添加到其中提到的 .asmx 文件。

当我调试时(在 Visual Studio 2010 上),上面的代码工作正常,不要求提供凭据(不幸的是,它没有提示打开、保存或取消文件下载的选项。但这是另一个问题,现在无需担心)并将文件保存在 C:.

发布后,代码不起作用。错误提示:授予用户'IIS APPPOOL\ASP.NET v4.0'的权限不足以执行此操作。所以我在 Reporting Service 的用户中添加了这个用户。当我再次尝试时,错误是:Login failed for user IISAPPPOOL\ASP.NET v4.0。无法创建与数据源 'MyDataSourceName' 的连接

报表和网站都部署/发布在具有 IIS 7.5 版本的同一台服务器上。

总结:我需要一个没有凭据提示的解决方案,用户可以选择保存.pdf文件的位置。

任何帮助将不胜感激。

如果您需要更多信息来帮助我,请询问。

提前致谢。

4

1 回答 1

1

一种解决方案是创建一个新的应用程序池,其帐户有权访问您的受限资源,然后将您的 Web 应用程序分配给它。

于 2013-04-29T18:01:26.003 回答