来自 SSRS 的间歇性 401 未经授权的响应

Intermittent 401-Unauthorized response from SSRS

(使用C#,WebAPI,SQLServer2012w/report服务器,认证为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));

这里的目标是 public 上面向 IIS 的 Web API 控制器从 internal/firewall 受保护的 SSRS 下载文件流,然后将流中继到浏览器。 这有时会起作用……当它不起作用时,它 returns 最后一行出现 401 错误…… 标出的线表示试图解决没有用的问题。

一个解决方案 是更改请求的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));