【问题标题】:Reporting services: Get the PDF of a generated report报告服务:获取生成报告的 PDF
【发布时间】:2012-06-09 13:41:43
【问题描述】:

我有一个报告服务服务器,它已经有一些正在运行的报告,我现在需要通过一个自定义网站(运行 asp.net MVC3)生成它们。

我需要将此报告作为流/字节检索以将其发送给用户。没有“报告查看器”左右。

我上次使用报告服务是使用 sql 2005,我们应该将一个不起眼的 asmx 文件作为参考。

现在情况如何,使用 sql server 报告 2008 R2、.Net4 和 Visual Studio 2010?我找不到解释整个事情的教程。

(其实我找不到没有sql 2008 r2报表查看器的教程)

【问题讨论】:

  • 我认为您是在谈论通过 Web 服务 API 访问 SSRS。该网络服务究竟晦涩是什么?

标签: asp.net reporting-services reporting ssrs-2008


【解决方案1】:

MSDN 提供了几种方法。我经常使用URL access 在 ASP .NET 应用程序中快速简单的 PDF 按钮。

这是一个快速破解代码。可以清理它以使用集成身份验证,并且可以通过多种方式存储报告名称。 (我从一些旧代码中剪切并粘贴了它,这些代码会将报告存储到数据库中,然后可以从数据库中返回。

// First read in the report into memory.

string strReportUser = "RSUserName";
string strReportUserPW = "MySecretPassword";
string strReportUserDomain = "DomainName";

string sTargetURL = "http://SqlServer/ReportServer?" +
   "/MyReportFolder/Report1&rs:Command=Render&rs:format=PDF&ReportParam=" +
   ParamValue;

HttpWebRequest req =
      (HttpWebRequest)WebRequest.Create( sTargetURL );
req.PreAuthenticate = true;
req.Credentials = new System.Net.NetworkCredential(
    strReportUser,
    strReportUserPW,
    strReportUserDomain );

HttpWebResponse HttpWResp = (HttpWebResponse)req.GetResponse();

Stream fStream = HttpWResp.GetResponseStream();




//Now turn around and send this as the response..
byte[] fileBytes = ReadFully( fStream );
// Could save to a database or file here as well.

Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader(
    "content-disposition",
    "attachment; filename=\"Report For " +
        ParamValue + ".pdf\"" );
Response.BinaryWrite( fileBytes );
Response.Flush();
HttpWResp.Close();
Response.End();

ReadFully 是

public static byte[] ReadFully( Stream input )
{
   using ( MemoryStream ms = new MemoryStream() )
   {
      input.CopyTo( ms );
      return ms.ToArray();
   }
}  

【讨论】:

  • 但是,如何管理标识?因为所有用户都不应该有权访问报告服务,不是吗?
  • 您能否将我指向正确的类/示例以从 URL 获取来自 SSRS 的报告?我必须承认我不知道如何访问 url、指定凭据和下载报告。非常感谢!
  • 不确定您在寻找什么。我在上面发布的 URL 访问链接包含三个可用于访问报告的不同 URL 示例。如何执行此操作的详细信息取决于您的报告:您使用哪些参数,您将如何获取您的凭据。我在答案中添加了一些示例 C# 代码。但是,如果您想要更好的示例,请让我们确切地知道您遇到困难的部分。
  • 谢谢 Jamie,这正是我所需要的。我不知道如何接收数据。我只是想知道我是否可以给 HttpWebRequest 它将写入响应流的流?
【解决方案2】:

由于您有嵌套流,您可能希望在复制后关闭第一个流以避免关闭流错误。此外,如果您收到 401 Unauthorized,请尝试使用默认凭据。

            req.UseDefaultCredentials = true;
            req.PreAuthenticate = true;
            req.Credentials = CredentialCache.DefaultCredentials;

            HttpWebResponse HttpWResp = (HttpWebResponse)req.GetResponse();

            Stream fStream = HttpWResp.GetResponseStream();                

            //Now turn around and send this as the response..
            byte[] fileBytes = ReadFully(fStream);
            // Could save to a database or file here as well.
            HttpWResp.Close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2012-06-21
    • 2012-08-23
    相关资源
    最近更新 更多