public
class
ReportsController : ReportsControllerBase
{
static
ReportServiceConfiguration configurationInstance;
static
ReportsController()
{
var appPath = HttpContext.Current.Server.MapPath(
"~/"
);
var reportsPath = Path.Combine(appPath,
"/ReportFiles"
);
var resolver =
new
CustomResolver2(reportsPath)
.AddFallbackResolver(
new
CustomResolver(reportsPath));
//Setup the ReportServiceConfiguration
configurationInstance =
new
ReportServiceConfiguration
{
HostAppId =
"Project"
,
Storage =
new
FileStorage(),
ReportResolver = resolver
// ReportSharingTimeout = 0,
// ClientSessionTimeout = 15,
};
}
public
ReportsController()
{
//Initialize the service configuration
this
.ReportServiceConfiguration = configurationInstance;
}
}
class
CustomResolver : ReportFileResolver
{
public
CustomResolver(
string
path) :
base
(path) { }
protected
override
ReportSource ResolveReport(
string
report)
{
return
base
.ResolveReport(report);
}
public
ReportSource GetReportSource(
string
report){
return
base
.ResolveReport(report);
}
}
class
CustomResolver2 : ReportFileResolver
{
private
CustomResolver customResolver;
public
CustomResolver2(
string
path) :
base
(path) {
customResolver =
new
CustomResolver(path);
}
public
ReportSource GetReportSource(
string
report)
{
return
base
.ResolveReport(report);
}
protected
override
ReportSource ResolveReport(
string
report)
{
ReportSource reportSource = customResolver.GetReportSource(report);
//TRDX
if
(report.Split(
'.'
).Last().ToLower().Equals(
"trdx"
))
{
var uriReportSource = (UriReportSource)reportSource;
var reportInstance = DeserializeReport(uriReportSource);
FixSubreportPath(reportInstance);
return
CreateInstanceReportSource(reportInstance, uriReportSource);
}
//TRDP
else
{
var uriReportSource = (UriReportSource)reportSource;
var reportInstance = UnpackReport(uriReportSource);
FixSubreportPath(reportInstance);
return
CreateInstanceReportSource(reportInstance, uriReportSource);
}
}
void
FixSubreportPath(ReportItemBase reportItemBase) {
foreach
(var item
in
reportItemBase.Items)
{
FixSubreportPath(item);
if
(item
is
SubReport)
{
var appPath = HttpContext.Current.Server.MapPath(
"~/"
);
var reportsPath = Path.Combine(appPath,
"/ReportFiles/"
);
var subReport = (SubReport)item;
var subUriReportSource = (UriReportSource)subReport.ReportSource;
var cr =
new
CustomResolver2(reportsPath);
subReport.ReportSource = cr.GetReportSource(subUriReportSource.Uri);
}
}
}
ReportSource CreateInstanceReportSource(IReportDocument report, ReportSource originalReportSource)
{
var instanceReportSource =
new
InstanceReportSource { ReportDocument = report };
instanceReportSource.Parameters.AddRange(originalReportSource.Parameters);
return
instanceReportSource;
}
Report DeserializeReport(UriReportSource uriReportSource)
{
var settings =
new
System.Xml.XmlReaderSettings();
settings.IgnoreWhitespace =
true
;
using
(var xmlReader = System.Xml.XmlReader.Create(uriReportSource.Uri, settings))
{
var xmlSerializer =
new
Telerik.Reporting.XmlSerialization.ReportXmlSerializer();
var report = (Telerik.Reporting.Report)xmlSerializer.Deserialize(xmlReader);