来自 SSRS 的间歇性 401 未经授权的响应
Intermittent 401-Unauthorized response from SSRS
(使用C#,WebAPI,SQLServer2012w/report服务器,认证为NTLM)
尝试从 SSRS 下载报告(作为 excel 文档)时出现间歇性错误。我构建了正确的 URL 来呈现如下报告:
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));
(使用C#,WebAPI,SQLServer2012w/report服务器,认证为NTLM)
尝试从 SSRS 下载报告(作为 excel 文档)时出现间歇性错误。我构建了正确的 URL 来呈现如下报告:
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));