我有一个用C#编写的Web应用程序,我需要能够在不使用Report Viewer控件的情况下在aspx页面上呈现SSRS
报告。
因为div标签内的HTML是完美的。我已通过SSRS
引用将该应用附加到我的ReportingService2010
实例。
我在网上找到了一些例子,但是ReportingServices2005
并不能移植它们。
我该怎么做?
答案 0 :(得分:6)
我把它从大约一年前放在一起的项目中拉出来。
几个关键点:
它使用ReportExecutionService引用,你将不得不玩它,但螺母和螺栓都应该在这里。
我真的很喜欢花时间清理一下但是我没有时间对不起,我希望它有所帮助
class RenderReport
{
public struct ReportServerCreds
{
public string UserName { get; set; }
public string Password { get; set; }
public string Domain { get; set; }
}
public ReportServerCreds GetReportCreds()
{
ReportServerCreds rsc = new ReportServerCreds();
rsc.UserName = ConfigurationManager.AppSettings["reportserveruser"].ToString();
rsc.Password = ConfigurationManager.AppSettings["reportserverpassword"].ToString();
rsc.Domain = ConfigurationManager.AppSettings["reportserverdomain"].ToString();
return rsc;
}
public enum SSRSExportType
{
HTML,PDF
}
public string RenderReport(string reportpath,SSRSExportType ExportType)
{
using (ReportExecutionService.ReportExecutionServiceSoapClient res = new ReportExecutionService.ReportExecutionServiceSoapClient("ReportExecutionServiceSoap"))
{
ReportExecutionService.ExecutionHeader ExecutionHeader = new ReportExecutionService.ExecutionHeader();
ReportExecutionService.TrustedUserHeader TrusteduserHeader = new ReportExecutionService.TrustedUserHeader();
res.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
ReportServerCreds rsc = GetReportCreds();
res.ClientCredentials.Windows.ClientCredential.Domain = rsc.Domain;
res.ClientCredentials.Windows.ClientCredential.UserName = rsc.UserName;
res.ClientCredentials.Windows.ClientCredential.Password = rsc.Password;
res.Open();
ReportExecutionService.ExecutionInfo ei = new ReportExecutionService.ExecutionInfo();
string format =null;
string deviceinfo =null;
string mimetype = null;
if (ExportType.ToString().ToLower() == "html")
{
format = "HTML4.0";
deviceinfo = @"<DeviceInfo><StreamRoot>/</StreamRoot><HTMLFragment>True</HTMLFragment></DeviceInfo>";
}
else if (ExportType.ToString().ToLower() == "pdf")
{
format = "PDF";
mimetype = "";
}
byte[] results = null;
string extension = null;
string Encoding = null;
ReportExecutionService.Warning[] warnings;
string[] streamids = null;
string historyid = null;
ReportExecutionService.ExecutionHeader Eheader;
ReportExecutionService.ServerInfoHeader serverinfoheader;
ReportExecutionService.ExecutionInfo executioninfo;
// Get available parameters from specified report.
ParameterValue[] paramvalues = null;
DataSourceCredentials[] dscreds = null;
ReportParameter[] rparams = null;
using (ReportService.ReportingService2005SoapClient lrs = new ReportService.ReportingService2005SoapClient("ReportingService2005Soap"))
{
lrs.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
lrs.ClientCredentials.Windows.ClientCredential.Domain = rsc.Domain;
lrs.ClientCredentials.Windows.ClientCredential.UserName = rsc.UserName;
lrs.ClientCredentials.Windows.ClientCredential.Password = rsc.Password;
lrs.GetReportParameters(reportpath,historyid,false,paramvalues,dscreds,out rparams);
}
// Set report parameters here
//List<ReportExecutionService.ParameterValue> parametervalues = new List<ReportExecutionService.ParameterValue>();
//string enumber = Session["ENumber"] as string;
//parametervalues.Add(new ReportExecutionService.ParameterValue() { Name = "ENumber", Value = enumber });
//if (date != null)
//{
// DateTime dt = DateTime.Today;
//parametervalues.Add(new ReportExecutionService.ParameterValue() { Name = "AttendanceDate", Value = dt.ToString("MM/dd/yyyy")});
//}
//if (ContainsParameter(rparams, "DEEWRID"))
//{
//parametervalues.Add(new ReportExecutionService.ParameterValue() { Name = "DEEWRID", Value = deewrid });
//}
//if (ContainsParameter(rparams, "BaseHostURL"))
//{
// parametervalues.Add(new ReportExecutionService.ParameterValue() { Name = "BaseHostURL", Value = string.Concat("http://", Request.Url.Authority) });
//}
//parametervalues.Add(new ReportExecutionService.ParameterValue() {Name="AttendanceDate",Value=null });
//parametervalues.Add(new ReportExecutionService.ParameterValue() { Name = "ENumber", Value = "E1013" });
try
{
Eheader = res.LoadReport(TrusteduserHeader, reportpath, historyid, out serverinfoheader, out executioninfo);
serverinfoheader = res.SetExecutionParameters(Eheader, TrusteduserHeader, parametervalues.ToArray(), null, out executioninfo);
res.Render(Eheader, TrusteduserHeader, format, deviceinfo, out results, out extension, out mimetype, out Encoding, out warnings, out streamids);
string exportfilename = string.Concat(enumber, reportpath);
if (ExportType.ToString().ToLower() == "html")
{
//write html
string html = string.Empty;
html = System.Text.Encoding.Default.GetString(results);
html = GetReportImages(res, Eheader, TrusteduserHeader, format, streamids, html);
return html;
}
else if (ExportType.ToString().ToLower() == "pdf")
{
//write to pdf
Response.Buffer = true;
Response.Clear();
Response.ContentType = mimetype;
//Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.pdf", exportfilename));
Response.BinaryWrite(results);
Response.Flush();
Response.End();
}
}
catch (Exception e)
{
Response.Write(e.Message);
}
}
}
string GetReportImages(ReportExecutionService.ReportExecutionServiceSoapClient res,
ReportExecutionService.ExecutionHeader EHeader,
ReportExecutionService.TrustedUserHeader tuh,
string reportFormat, string[] streamIDs, string html)
{
if (reportFormat.Equals("HTML4.0") && streamIDs.Length > 0)
{
string devInfo;
string mimeType;
string Encoding;
int startIndex;
int endIndex;
string fileExtension = ".jpg";
string SessionId;
Byte[] image;
foreach (string streamId in streamIDs)
{
SessionId = Guid.NewGuid().ToString().Replace("}", "").Replace("{", "").Replace("-", "");
//startIndex = html.IndexOf(streamId);
//endIndex = startIndex + streamId.Length;
string reportreplacementname = string.Concat(streamId, "_", SessionId, fileExtension);
html = html.Replace(streamId, string.Concat(@"Report\GraphFiles\", reportreplacementname));
//html = html.Insert(endIndex, fileExtension);
//html = html.Insert(startIndex, @"Report/GraphFiles/" + SessionId + "_");
devInfo = "";
//Image = res.RenderStream(reportFormat, streamId, devInfo, out encoding, out mimeType);
res.RenderStream(EHeader,tuh, reportFormat, streamId, devInfo, out image , out Encoding, out mimeType);
System.IO.FileStream stream = System.IO.File.OpenWrite(HttpContext.Current.Request.PhysicalApplicationPath + "Report\\GraphFiles\\" + reportreplacementname);
stream.Write(image, 0, image.Length);
stream.Close();
mimeType = "text/html";
}
}
return html;
}
bool ContainsParameter(ReportParameter[] parameters, string paramname)
{
if(parameters.Where(i=>i.Name.Contains(paramname)).Count() != 0)
{
return true;
}
return false;
}
}
执行:
第一个参数是服务器上报告的位置。 第二个是SSRSExportType枚举
RenderReport("ReportPathOnServer",SSRSExportType.HTML);
答案 1 :(得分:0)
如果您只是尝试显示报表的HTML呈现,并且希望它看起来像应用程序的本机对象而没有任何参数或工具栏,那么您可以直接调用报表的URL并包含“&amp; URL中的rc:Toolbar = false“。这将隐藏Report Viewer控件的工具栏。此方法在URL Access Parameter Reference msdn article下描述。不完全是你要求的,但它可能达到目的。
如果要将结果嵌入到现有HTML文档中,这是一个省略HTML和Body部分的示例调用:
http://ServerName/ReportServer?%2fSome+Folder%2fSome+Report+Name&rs:Command=Render&rc:Toolbar=false&rc:HTMLFragment=true
答案 2 :(得分:0)
绝对是一个老问题,但是如果您使用的是ASP.NET MVC,则可以尝试this open source solution。它使用HTML帮助器,并在iframe中呈现.aspx
页。存储库具有服务器端,本地渲染和匿名示例。