[英]Rendering SSRS in C# console app; where to find SSRS ReportExecutionService?
在 C# 控制台应用程序中,我尝试在我们的报告服务器上呈现 SSRS 报告,然后我会将其流式传输到 PDF 文件。 我找到了多份文档,但遇到了障碍……如何添加对 Report Execution Service 的引用?
我能够遵循代码示例中的第一步……我添加了一个服务引用/单击添加 Web 引用,键入http://ServerName/ReportServer_XXX/reportservice2010.asmx
,(我通过远程连接到服务器并运行获得了ReportServer_XXX
RS 配置管理器)。 然后我可以这样做:
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 站点中的文件夹(章节、财务、市场营销等)。 “添加引用”按钮变灰。
我在做什么蠢事? 谢谢!
你根本没有做蠢事。 但是,您可能希望将该 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;
}
另一种方法是制作 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.