【问题标题】:Rendering SSRS in C# console app; where to find SSRS ReportExecutionService?在 C# 控制台应用程序中渲染 SSRS;在哪里可以找到 SSRS ReportExecutionService?
【发布时间】:2023-03-13 02:30:01
【问题描述】:

在 C# 控制台应用程序中,我尝试在我们的报告服务器上呈现 SSRS 报告,然后将其流式传输到 PDF 文件。 我找到了多个文档,但遇到了障碍……如何添加对报告执行服务的引用?

我能够按照代码示例中的第一步...添加服务引用/单击添加 Web 引用,输入 http://ServerName/ReportServer_XXX/reportservice2010.asmx, (通过远程连接到服务器并运行 RS 配置管理器,我得到了 ReportServer_XXX)。 然后我可以做到:

var rs = new ReportingService.ReportingService2010();
rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
// etc.

下一步是添加对ReportExecutionService 的Web 引用,这就是Render() 方法实际将PDF 输出为字节数组的原因。 但是,当我输入 URL 时: http://ServerName/ReportServer_XXX/reportexecutionservice2010.asmx (或...2005.asmx),它会弹出一个标题 ServerName/ReportServer_XXX - / 在我们的 SSRS 站点中的文件夹(章节、财务、营销等)下。 “添加参考”按钮显示为灰色。

我在做什么蠢事? 谢谢!

【问题讨论】:

标签: c# reporting-services service render


【解决方案1】:

你一点也不傻。但是,您可能希望将该 URL 更改为类似的内容。

ReportExecutionService rexec = new ReportExecutionService();
rexec.Credentials = System.Net.CredentialCache.DefaultCredentials;
rexec.Url = "http://<your report server>/reportserver/ReportExecution2005.asmx";

我知道这是违反直觉的。我正在使用 SSRS 2017 和 VS 2017,它仍然是“2005”。以下是来自 Microsoft 的 SSRS 样板:

string encoding = null;
Warning[] warnings = null;
string[] streamIDs = null;
ExecutionInfo execInfo = new ExecutionInfo();
ExecutionHeader execHeader = new ExecutionHeader();
rexec.ExecutionHeaderValue = execHeader;
execInfo = rexec.LoadReport(reportPath, historyID);
rexec.SetExecutionParameters(parameters, "en-us");
Console.WriteLine("SessionID: {0}", rexec.ExecutionHeaderValue.ExecutionID);
try
{
    Console.WriteLine(reportName.ToString());
    result = rexec.Render(format, devInfo, out string extension, out string 
        mimeType, out encoding, out warnings, out streamIDs);
    execInfo = rexec.GetExecutionInfo();
    Console.WriteLine("Execution date and time: {0}", execInfo.ExecutionDateTime);
}
catch (SoapException e)
{
    Console.WriteLine(e.Detail.OuterXml);
    Dts.Events.FireError(0, "Error ",e.Message+ "\r" + e.StackTrace, String.Empty,0);
    Dts.TaskResult = (int)ScriptResults.Failure;
}

【讨论】:

  • 谢谢史蒂夫_马尔科姆
【解决方案2】:

另一种方法是发出 WebRequest。我创建了这个函数:

  public static byte[] GenerateReport(string ReportServer, string Username, string Password, string Domain, string ReportPath, string Format, string Parameters)
  {

      ReportPath = ReportPath.Replace("/", "%2f").Replace(" ", "+");
      string URL = ReportServer + "?" + ReportPath + $"&rs:Command=Render&rs:Format=" + Format + "&rs:ParameterLanguage=en-GB" + "&" + Parameters;
      WebRequest Req = WebRequest.Create(URL);
      Req.Credentials = new NetworkCredential(Username, Password, Domain);
      Req.Timeout = Convert.ToInt32(ConfigurationManager.AppSettings["SSRSTimeout"]);
      Stream WebStream = Req.GetResponse().GetResponseStream();
      MemoryStream MemStream = new MemoryStream();
      WebStream.CopyTo(MemStream);
      long Len = MemStream.Length;
      byte[] ReportReturn = new byte[Len];
      MemStream.Seek(0, SeekOrigin.Begin);
      MemStream.Read(ReportReturn, 0, (int)Len);
      WebStream.Close();
      MemStream.Close();
      MemStream.Dispose();
      return ReportReturn;
  }

用途:

  string Domain = ConfigurationManager.AppSettings["SSRSDomain"];
  string Username = ConfigurationManager.AppSettings["SSRSUser"];
  string Password = ConfigurationManager.AppSettings["SSRSPass"];
  string ReportServer = ConfigurationManager.AppSettings["SSRSServer"];

  string ReportPath = "/Report Path/ReportName";
  string Params = "ParamName=ParamValue";

  byte[] ReportData = GenerateReport(ReportServer, Username, Password, Domain, ReportPath, "PDF", Params);

  File.WriteAllBytes(AppDomain.CurrentDomain.BaseDirectory + @"\" + "savedfilename.pdf", ReportData);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2010-12-10
    • 2019-07-03
    相关资源
    最近更新 更多