以编程方式在C#中将SSRS报告另存为PDF

问题描述:

我已经阅读了有关此问题的多篇文章,但是他们最终都以失败告终,或者在vb.net中.

I've read through multiple articles regarding this issue however they have all ended up with it not working, or are in vb.net.

我目前所拥有的:

通过URL访问报告,当用户单击按钮时,报告将URL呈现为PDF并将其保存在downloads文件夹中,并赋予它们通用名称,例如OrderReport,OrderReport(1)...等.

The reports are accessed via a URL which renders them as a PDF and saves them in the downloads folder when the user clicks on a button, these are given generic names such as OrderReport, OrderReport(1)... and so on.

var orderNum = 1;

"http://Server/ReportServer_Name/Pages/ReportViewer.aspx?%2fOrderReport&rs:Command=Render&OrderID=" + orderNum + "&rs:ClearSession=true&rs:Format=PDF"

我要实现的目标:

  • 如果可能,我想使用C#来获取此报告,然后为PDF文件指定一个名称并将其保存在正确的位置.

例如,我想将此报告保存在一个名为 OrderID-1 的临时文件夹" C:\ temp "中.我正在使用C#

so for example I would like to save this report in a temporary folder for now "C:\temp" with the name OrderID-1. I am using C#

我已将ServiceReference添加到我正在使用的称为ReportTestings的项目中,因此引用为

I have added in a ServiceReference into the Project i am using called ReportTestings so the reference is

using ReportTestings;

和Web参考URL:

http://Server/ReportServer_Name/ReportExecution2005.asmx

(出于安全原因删除了实际名称)

(removed the actual names for security reasons)

因此,根据以上所有信息,有人可以向我指出正确的方向或提供示例代码,谢谢您阅读本文或提供帮助

so based on all of this information above could someone point me in the right direction or give an example part of code, Thankyou for all that read this post or help

使用此代码,我得到此错误:(+ e

using this code i get this error :(+ e

{"Access to the path 'C:\\Program Files (x86)\\IIS Express\\report1one.pdf' is denied."}    System.Exception {System.UnauthorizedAccessException})

代码:

    ReportExecutionService rs = new ReportExecutionService();
    rs.Credentials = new NetworkCredential("username", "password", "domain");
    rs.Url = "http://Server/ReportServer_Name/reportexecution2005.asmx";

    // Render arguments
    byte[] result = null;
    string reportPath = "/Invoice";
    string format = "PDF";
    string historyID = null;
    string devInfo = @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";

    // Prepare report parameter.
    ParameterValue[] parameters = new ParameterValue[3];
    parameters[0] = new ParameterValue();
    parameters[0].Name = "InvoiceID";
    parameters[0].Value = "2";

    DataSourceCredentials[] credentials = null;
    string showHideToggle = null;
    string encoding;
    string mimeType;
    string extension;
    Warning[] warnings = null;
    ParameterValue[] reportHistoryParameters = null;
    string[] streamIDs = null;

    ExecutionInfo execInfo = new ExecutionInfo();
    ExecutionHeader execHeader = new ExecutionHeader();

    rs.ExecutionHeaderValue = execHeader;

    execInfo = rs.LoadReport(reportPath, historyID);

    rs.SetExecutionParameters(parameters, "en-us");
    String SessionId = rs.ExecutionHeaderValue.ExecutionID;

    Console.WriteLine("SessionID: {0}", rs.ExecutionHeaderValue.ExecutionID);


    try
    {
        result = rs.Render(format, devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);

        execInfo = rs.GetExecutionInfo();

        Console.WriteLine("Execution date and time: {0}", execInfo.ExecutionDateTime);


    }
    catch (SoapException e)
    {
        Console.WriteLine(e.Detail.OuterXml);
    }
    // Write the contents of the report to an MHTML file.
    try
    {
        FileStream stream = File.Create("report1one.pdf", result.Length);
        Console.WriteLine("File created.");
        stream.Write(result, 0, result.Length);
        Console.WriteLine("Result written to the file.");
        stream.Close();
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }

您正在使用的Web服务URL( ReportService2012 )用于管理报表服务器对象.

The webservice URL you are using (ReportService2012) is for managing the report server objects.

如果需要呈现报告,则应使用 ReportExecution2005 网络服务.

If you need to render reports, you should be using the ReportExecution2005 webservice.

要开始使用,您应该看看渲染方法.

To get started, you should take a look at the Render method.

要指定凭据,您可以添加以下行(与您的链接中使用的变量名称相同: RS2005 ):

To specify credentials you can add the folowing line (I'm the same variable name used in your link: RS2005):

RS2005.Credentials = new System.Net.NetworkCredential("username", "password", "domain");

当您的应用程序尝试将文件与Web应用程序一起保存时,会出现拒绝访问"错误,因此您应该使用绝对路径或使用

Your access denied error occurs when your application try to save the file with your web application, so you should use an absolute path or resolve it using Server.MapPath