2

我有一个似乎工作正常的报告,但是当我尝试在我的 asp.net MVC 应用程序中下载它时,我得到了 500。我只是尝试使用 URL 访问下载它的 pdf 版本。为此,我执行以下操作:

WebClient client = new WebClient();
NetworkCredential nwc = new NetworkCredential(ConfigurationManager.AppSettings["SSRSUserName"], ConfigurationManager.AppSettings["SSRSPassword"]);
client.Credentials = nwc;
string paramList = "&OrderId=" + orderId;

string reportURL = ConfigurationManager.AppSettings["SSRSBaseUrl"] +
            ConfigurationManager.AppSettings["SSRSReport"] + 
            "&rs:Command=Render&rs:Format=PDF" +
            paramList;
try 
{
     byte[] reportBytes = client.DownloadData(reportURL);
}

为了验证我的报告是否正常工作,我将生成的 reportURL 字符串放入浏览器中,果然我的报告完美下载。

有谁知道为什么我会在我的应用程序中获得 500,但 pdf 会在我的应用程序之外使用相同的 URL 完美下载?他们是我缺少的一些配置吗?

服务器版本为 SQL Server 2016

4

1 回答 1

2

总结讨论和解决方案,通过设置属性UseDefaultCredentials = true为已WebClient解决的通用 500 内部服务器错误使用默认凭据。

由于您的安装是在 SQL Server 2008 之后安装的,因此身份验证请求由 Reporting Services 实例在内部处理。

在以前版本的 Reporting Services 中,所有身份验证支持均由 IIS 提供。从 SQL Server 2008 版本开始,不再使用 IIS。Reporting Services 在内部处理所有身份验证请求。

默认情况下,报表服务器使用依赖于 Windows 集成身份验证的身份验证方法:协商和 NTLM,如使用报表服务器进行身份验证中所述

由于本例中的 Reports Server 使用以下一种或所有身份验证方法:协商、NTLM 和 Kerberos,并且这不是 ASP.NET 应用程序,因此需要使用默认凭据,如DefaultCredentials中所述:

DefaultCredentials 属性仅适用于 NTLM、协商和基于 Kerberos 的身份验证。

DefaultCredentials 表示当前运行应用程序的安全上下文的系统凭据。对于客户端应用程序,这些通常是运行应用程序的用户的 Windows 凭据(用户名、密码和域)。对于 ASP.NET 应用程序,默认凭据是登录用户或被模拟用户的用户凭据。

这就是为什么您可以通过浏览器中的 URL 而不是应用程序中的 URL 访问报告查看器的原因。

于 2016-08-18T16:39:19.467 回答