嗯,我已经尝试了很多东西来解决这个问题,但都没有。访问报告服务时的验证问题
我开发了一个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文件的位置。
任何帮助将不胜感激。
如果您需要更多信息来帮助我,请提问。
在此先感谢。
Hello George。完美的作品。对不起,如果我打扰你太多了,但是...你有解决方案来提示下载框(选项OPEN,SAVE和CANCEL)吗?我已经搜索过,并且没有发现任何可以解决网站问题的东西,只是使用Windows Forms。无论如何,我很乐意为你提供帮助。 – Fernando 2013-04-29 18:15:31
@Fernando很高兴帮助。如果您还有其他问题,请将其作为新问题发布,我和其他人会很乐意提供帮助。 – 2013-04-29 18:17:56