6

(使用 C#、Web API、带有报告服务器的 SQL Server2012,身份验证为 NTLM)

尝试从 SSRS 下载报告(作为 Excel 文档)时出现间歇性错误。我构建了正确的 URL 来呈现报告,例如:

http://sqlServer/ReportServer/Pages/ReportViewer.aspx?/TheReportName&rs:Command=Render&rs:format=excel&rc:Parameters=false&Region=WEST&CutOffDate=10/25/2015

WebClient webClient = new WebClient();
webClient.Credentials = new NetworkCredential("myDom\\myReportReader", "P@55W0rd");
     //string credentials = Convert.ToBase64String(
     //    Encoding.ASCII.GetBytes("myDom\\myReportReader" + ":" + P@55W0rd"));
     //webClient.Headers[HttpRequestHeader.Authorization] = string.Format("Basic {0}", credentials);

//401 Unauthorized thrown here:
return new MemoryStream(webClient.DownloadData(reportUrl));

这里的目标是面向公众的 IIS 上的 Web API 控制器从受内部/防火墙保护的 SSRS 下载文件流,然后将流中继到浏览器。这有时会起作用...当它不起作用时,它会在最后一行返回 401 错误...注释掉的行表示尝试解决不起作用的问题。

4

1 回答 1

8

一种解决方案是更改请求的 URL。

当您想通过 ReportViewer.aspx 导出报告时,SSRS 通过重定向(http 状态 302)进行响应。并且 WebClient 不会将凭据重新发送到重定向页面。

您应该以这种格式请求报告: http://sqlServer/ReportServer?/TheReportName&rs:Format=EXCEL&rc:Parameters ...所以只需从 URL 中删除这个序列:/Pages/ReportViewer.aspx

有关使用 URL 访问导出报告的更多信息,请参见此处:https ://msdn.microsoft.com/en-us/library/ms154040.aspx

另一种解决方案是保留非最佳 URL 并使用CredentialCache,它将向重定向页面提供凭据,但不要忘记Uri仅将参数设置为 URL前缀,即 'http://sqlServer' 或 'http: //sqlServer/ReportServer',仅此而已。

WebClient webClient = new WebClient();
var nc = new NetworkCredential("myReportReader", "P@55W0rd", "myDom");
var cc = new CredentialCache{{new Uri("http://sqlServer"), "Ntlm", nc}};
webClient.Credentials = cc;
return new MemoryStream(webClient.DownloadData(reportUrl));
于 2015-12-22T13:41:07.327 回答