(使用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 )