web-dev-qa-db-ja.com

SSRSレポートをC#でPDFとしてプログラムで保存

この問題に関する複数の記事を読みましたが、すべてが機能しないか、vb.netにあります。

私が現在持っているもの:

レポートは、PDFとしてレンダリングされ、ユーザーがボタンをクリックするとダウンロードフォルダーに保存されるURLを介してアクセスされます。これらには、OrderReport、OrderReport(1)などの一般的な名前が付けられます。 ... 等々。

var orderNum = 1;

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

私が達成しようとしていること:

  • 可能であれば、C#を使用してこのレポートをフェッチし、PDFファイルの名前を指定して、正しい場所に保存したいと思います。

たとえば、このレポートを今のところ一時フォルダに「C:\ temp」という名前で保存したいと思いますOrderID-1。私はC#を使用しています

私が使用しているProjectTestingsというプロジェクトにServiceReferenceを追加したので、参照は

using ReportTestings;

およびWeb参照URL:

http://Server/ReportServer_Name/ReportExecution2005.asmx

(セキュリティ上の理由から実際の名前を削除しました)

したがって、上記のすべての情報に基づいて、誰かが私を正しい方向に向けたり、コードの例の一部を示したりする可能性があります。この投稿を読んだり、助けてくれたすべての人に感謝します

このコードを使用すると、このエラーが発生します:(+ 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);
    }
5
Crezzer7

使用しているWebサービスURL( ReportService2012 )は、レポートサーバーオブジェクトを管理するためのものです。

レポートをレンダリングする必要がある場合は、 ReportExecution2005 Webサービスを使用する必要があります。

開始するには、 Render メソッドを確認する必要があります。


資格情報を指定するには、次の行を追加します(私はあなたのリンクで使用されているのと同じ変数名です:RS2005):

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

編集:

アプリケーションがWebアプリケーションでファイルを保存しようとすると、アクセス拒否エラーが発生するため、絶対パスを使用するか、 Server.MapPath を使用して解決する必要があります。

7