下载SSRS报告并保存在特定位置(C#)(未经授权)

时间:2016-10-31 08:44:43

标签: c# reporting-services ssrs-2012

问题

我正在尝试通过其URL将SSRS报告下载到数据缓冲区(字节数组)中,因此我可以将其保存在特定文件夹中,并使用我选择的名称。如果需要,我愿意接受不同方式的建议。

问题

然而,无论我输入哪种凭据,我都会不断收到以下错误(401)未经授权

  

类型' System.Net.WebException'的例外情况发生在System.dll中   但未在用户代码中处理

     

其他信息:远程服务器返回错误:(401)   未经授权的

我正在使用此代码(C#):

WebClient myWebClient = new WebClient();
NetworkCredential netCredential = new NetworkCredential("username", "password");
myWebClient.Credentials = netCredential;

var theURL = "http://ReportServer/ReportServer_MYSERVER/Pages/ReportViewer.aspx?%2fPurchaseOrder&rs:Command=Render&OrderID=100&rs:ClearSession=true&rs:Format=PDF"

byte[] myDataBuffer = myWebClient.DownloadData(theURL);

示例网址(如果我只是将以下网址复制到我的浏览器中,则会完全下载该文件,访问权限无任何问题):http://ReportServer/ReportServer_MYSERVER/Pages/ReportViewer.aspx?%2fPurchaseOrder&rs:Command=Render&OrderID=100&rs:ClearSession=true&rs:Format=PDF

我的计算机位于域上,我已经尝试过这些凭据,域名以及数据库SA帐户,但两者都提供了同样的问题。

我知道这段代码在下载PDF文件时有效,因为我从互联网上对随机网址进行了硬编码,这很有效,例如:" http://www.axmag.com/download/pdfurl-guide.pdf"

谢谢你们在这件事上的帮助,我希望这是可能的,因为这将是我的应用程序的一个非常方便的补充

4 个答案:

答案 0 :(得分:3)

事实证明,对于我的场景(使用默认凭据),它就像这一样简单:

var theURL = "http://ReportServer/ReportServer_MYSERVER/Pages/ReportViewer.aspx?%2fPurchaseOrder&rs:Command=Render&OrderID=100&rs:ClearSession=true&rs:Format=PDF";

WebClient Client = new WebClient();
Client.UseDefaultCredentials = true;

byte[] myDataBuffer = Client.DownloadData(theURL);

上面的代码可以将任何SSRS报告作为字节数组下载。这意味着它可以保存在指定的位置,并使用您选择的名称:

var filename = "Test.PDF";
var fileStructureLocal = "C:\\Test";
var fileStructureNetwork = "\\\\NetworkDrive\TestFolder";

var fileLocation = fileStructureNetwork + "\\" + filename;

 if (System.IO.File.Exists(url) == true)
        {
            //DO NOTHING
        }
 else
        {
            System.IO.File.WriteAllBytes(url, myDataBuffer);
            //SAVE FILE HERE
        }

下一个块是重命名文件的方式,并指定位置。我还添加了一个检查,看它是否已经存在,如果它确实没有做任何事情。

我希望这会有所帮助,因为这是我一直试图长时间工作的事情!

答案 1 :(得分:1)

使用 ReportExecutionService 类将是最佳的替代解决方案。报告无法下载的可能性非常小。

每个Microsoft SQL Server Reporting Server都为 ReportExecutionService 提供SOAP端点。第三方应用程序可以使用此扩展程序来连接到报表服务器。

对于.Net应用程序,我们可以使用Visual Studio将Web引用添加到SOAP端点http://(your_server_url)/reportserver/reportexecution2005.asmx(ReportExecutionService)。

这将生成必要的名称,并分类到SOAP端点,我们可以在应用程序中使用该端点来下载报告。

下面给出了示例代码。可以在

上找到添加Web参考的步骤,常见错误以及有关此方法的其他详细信息。

https://www.craftedforeveryone.com/download-sql-server-reporting-service-ssrs-report-as-pdf-using-c-sharp/

注意:我们没有可用于解析名称空间ReportExecutionService的NuGet包或库。将Web引用添加到您的报表服务器将解决此问题。

using DownloadSSRSReport.craftedforeveryone.com;
using System.Collections.Generic;
using System.IO;
using System.Net;

namespace DownloadSSRSReport
{
class Program
{
static void Main(string[] args)
{
ReportExecutionService rs = new ReportExecutionService();
rs.Credentials = CredentialCache.DefaultCredentials;
rs.Url = "http://craftedforeveryone.com/reportserver/reportexecution2005.asmx";

rs.ExecutionHeaderValue = new ExecutionHeader();
var executionInfo = new ExecutionInfo();
executionInfo = rs.LoadReport("/your report path/report name", null);

List<ParameterValue> parameters = new List<ParameterValue>();

parameters.Add(new ParameterValue { Name = "parameterId", Value = "value" });

rs.SetExecutionParameters(parameters.ToArray(), "en-US");


string deviceInfo = "<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";
string mimeType;
string encoding;
string[] streamId;
Warning[] warning;

var result = rs.Render("PDF", deviceInfo, out mimeType, out encoding, out encoding, out warning, out streamId);
File.WriteAllBytes("c:\\temp\\report.pdf", result);

}
}
}

答案 2 :(得分:0)

为我工作,只有区别使用了HTTPClient

var theURL = "http://ReportServer/ReportServer_MYSERVER/Pages/ReportViewer.aspx?%2fPurchaseOrder&rs:Command=Render&OrderID=100&rs:ClearSession=true&rs:Format=PDF";

var httpClientHandler = new HttpClientHandler()
                                    {
                                        UseDefaultCredentials = true
                                    };

            HttpClient webClient = new HttpClient(httpClientHandler);

            byte[] response = await webClient.GetByteArrayAsync(theURL);

答案 3 :(得分:0)

我在vb.net中使用自定义身份验证编写了以下内容,

     
private sub GenerateReportPDF () 
 Dim username As String = "username"
          Dim password As String = "password"
          Dim strURL As String = $"https://server/ReportServer/Pages/ReportViewer.aspx?Report&param1=" + Param1 + "&Param2=" + Param1 + "&rs:Format=PDF"

          'prepare the request'
          Dim req As WebClient = New WebClient()
          req.Credentials = CredentialCache.DefaultCredentials
          req.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials
          req.UseDefaultCredentials = True

          Dim myCache As New CredentialCache()
          myCache.Add(New Uri($"https://server/reportserver"), "NTLM", New System.Net.NetworkCredential(username, password, "domainName"))
          req.Credentials = myCache

          'prepare the response'
          Dim myResponse As HttpResponse = HttpContext.Current.Response
          myResponse.Clear()
          myResponse.ClearContent()
          myResponse.ClearHeaders()
          myResponse.Buffer = True
          myResponse.ContentType = "application/pdf"
          myResponse.BinaryWrite(req.DownloadData(strURL))
          myResponse.End()
End Sub
相关问题