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



(使用C#、Web API、SQL Server2012和报表服务器,身份验证为NTLM)

我在尝试从SSRS下载报告(作为excel文档)时遇到了一个间歇性错误。我构建了正确的URL来呈现这样的报告:

http://sqlServer/ReportServer/Pages/ReportViewer.aspx?/TheReportName&rs:Command=渲染&rs:format=excel&rc:Parameters=false&区域=WEST&截止日期=2015年10月25日

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错误。。。注释的底线代表着试图解决这个没有奏效的问题。

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

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

您应该请求以下格式的报告:http://sqlServer/ReportServer?/TheReportName&rs:Format=EXCEL&rc:参数。。。因此,只需从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));

您可以将ssrs报告作为参数从powershell传递到ssrs报告服务器。SSRS重定向到报告。reportname将成为SSRS报表服务器的参数。

$SSRSurl=";http://reports.abc.company.com/ReportServer?/My+Directory+For++报告/ABCReport&字段1Param=123&Field2Param=321&rs:Format=EXCEL";

$spreadsheet_file="abc.xls"
$Path = "C:download_directory$spreadsheet_file"
$WebClient = New-Object System.Net.WebClient
$WebClient.Credentials = New-Object System.Net.Networkcredential($User, $PasswordAsString)
$WebClient.DownloadFile( $SSRSurl, $path )

相关内容

  • 没有找到相关文章

最新更新