2013-04-29 81 views
0

嗯,我已经尝试了很多东西来解决这个问题,但都没有。访问报告服务时的验证问题

我开发了一个Reporting Service(2005)并进行了部署。

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

当用户点击按钮以下载报告自动生成的.pdf(最终用户从未看到报告的html版本)时,它会要求提供Windows凭据。

如果用户输入有效凭证(并且此凭证必须是部署Reporting Service的服务器上的有效凭证),则明显会下载.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中的名称。 DataBase连接的相同问题无法完成。 我返回的物理路径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); 
     } 

对于这个代码,我只好一个Web引用添加到它提到的.asmx文件。当我调试时(在Visual Studio 2010上),上面的代码工作正常,不要求凭据(不幸的是,它不会提示打开,保存或取消de文件下载的选项。是另一个问题,现在不用担心)并将文件保存在C :.

发布时,代码不起作用。一个erros说:授予用户'IIS APPPOOL \ ASP.NET v4.0'的权限不足以执行此操作。所以我向Reporting Service的用户添加了这个用户。当我再次尝试时,错误是:用户登录失败IISAPPPOOL \ ASP.NET v4.0。无法创建与数据源'MyDataSourceName'的连接。

报告和WebSite都在IIS 7.5版本的同一台服务器上部署/发布。

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

任何帮助将不胜感激。

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

在此先感谢。

回答

1

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

+0

Hello George。完美的作品。对不起,如果我打扰你太多了,但是...你有解决方案来提示下载框(选项OPEN,SAVE和CANCEL)吗?我已经搜索过,并且没有发现任何可以解决网站问题的东西,只是使用Windows Forms。无论如何,我很乐意为你提供帮助。 – Fernando 2013-04-29 18:15:31

+1

@Fernando很高兴帮助。如果您还有其他问题,请将其作为新问题发布,我和其他人会很乐意提供帮助。 – 2013-04-29 18:17:56