【问题标题】:Why do I get a 500 when trying to download an SSRS report using URL access?为什么我在尝试使用 URL 访问下载 SSRS 报告时得到 500?
【发布时间】:2016-08-15 20:20:24
【问题描述】:

我有一份似乎工作正常的报告,但是当我尝试在我的 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

【问题讨论】:

  • 两个建议,有点反复试验。不要使用字符串,而是将 URL 定义为 Uri 并将其传递给 DownloadData。我想知道DownloadData 内部是否对 URL 参数的编码有期望,WebClient 的默认编码会导致 URL 格式错误。另一种是通过设置类似如下的用户代理来模拟浏览器:client.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
  • @JonathonOgden 我试图将我的 url 字符串切换为 uri,但没有任何运气。在尝试模拟浏览器时,我在您提供的行中遇到了几个编译错误。 VS 说:意外字符“。知道为什么不能编译吗?谢谢
  • @JonathonOgden 不确定我做了什么,但我得到了编译,但在模拟浏览器时它仍然无法工作。
  • 好的,还有一个问题我忽略了。您是否有任何特殊原因要下载数据而不是文件本身?你打算用它做什么?如果您只想以编程方式下载并保存文件,请改用DownloadFile
  • @JonathonOgden 我不只是下载和保存文件。获得文件后,我立即使用 PrintDocument 将其发送到打印机。有没有办法用文件做到这一点?对我来说,只下载数据并将其传递给 PrintDocument 更有意义。

标签: asp.net asp.net-mvc reporting-services ssrs-2016


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2014-04-21
    • 2013-03-19
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多