好吧,我已经尝试了很多东西来解决这个问题,但没有一个能解决这个问题。
我开发了一个Reporting Service(2005)并部署了它。
这个报告将被访问网站(它是一个互联网站点,因此,不会被内联网访问)的所有人在框架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凭据。其他的甚至不让我打开报告的虚拟目录或报告管理器的虚拟目录。
当我尝试将其更改为匿名身份验证时,他无法访问DataBase。然后,我选择安全存储在报表服务器上的凭据选项。仍然无效。
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);
}
对于此代码,我必须将WebReference添加到其中提到的.asmx文件中。
当我调试(在Visual Studio 2010上)时,上面的代码工作正常,不要求凭据(不幸的是,它没有提示打开,保存或取消de文件下载的选项。但这是另一个问题,现在不用担心)并将文件保存在C:。
发布时,代码不起作用。错误说:授予用户'IIS APPPOOL \ ASP.NET v4.0'的权限不足以执行此操作。所以我向Reporting Service的用户添加了这个用户。当我再次尝试时,错误是:用户 IISAPPPOOL \ ASP.NET v4.0 登录失败。无法创建与数据源“MyDataSourceName”的连接。
报告和WebSite都在IIS 7.5版本的同一台服务器上部署/发布。
总结:我需要一个没有凭据提示的解决方案,用户可以选择保存.pdf文件的位置。
任何帮助将不胜感激。
如果您需要更多信息来帮助我,请询问。
提前致谢。
答案 0 :(得分:1)
一种解决方案是创建一个新的应用程序池,其帐户有权访问您的受限资源,然后将您的Web应用程序分配给它。