Progress® Telerik® Reporting R2 2017

How To: Implement a Custom Report Resolver

This article explains how to create a custom report resolver for the Telerik Reporting REST service. In this example, the resolver purpose will be to return a XmlReportSource with an XML report definition obtained from an SQL Server database.

How to implement a custom report resolver:

  1. Create a class which implements the IReportResolver interface:

    class CustomReportResolver : Telerik.Reporting.Services.Engine.IReportResolver
    {
        public Telerik.Reporting.ReportSource Resolve(string reportId)
        {
            var cmdText = "SELECT Definition FROM Reports WHERE ID = @ReportId";
    
            var reportXml = "";
            using (var conn = new System.Data.SqlClient.SqlConnection(@"server=(local)\sqlexpress;database=REPORTS;integrated security=true;"))
            {
                var command = new System.Data.SqlClient.SqlCommand(cmdText, conn);
                command.Parameters.Add("@ReportId", System.Data.SqlDbType.Int);
                command.Parameters["@ReportId"].Value = reportId;
    
                try
                {
                    conn.Open();
                    reportXml = (string)command.ExecuteScalar();
                }
                catch (System.Exception ex)
                {
                    System.Diagnostics.Trace.WriteLine(ex.Message);
                }
            }
    
            if (string.IsNullOrEmpty(reportXml))
            {
                throw new System.Exception("Unable to load a report with the specified ID: " + reportId);
            }
    
            return new Telerik.Reporting.XmlReportSource { Xml = reportXml };
        }
    }
  2. Find the ReportResolver property in the ReportServiceConfiguration settings of the implementation of the ReportsControllerBase class, and set it to an instance of the custom report resolver or to a chain of resolver instances including the custom one:

    public class CustomResolverReportsController : Telerik.Reporting.Services.WebApi.ReportsControllerBase
    {
        static Telerik.Reporting.Services.ReportServiceConfiguration configurationInstance;
    
        static CustomResolverReportsController()
        {
            var resolver = new ReportFileResolver(HttpContext.Current.Server.MapPath("~/Reports"))
                .AddFallbackResolver(new ReportTypeResolver()
                    .AddFallbackResolver(new CustomReportResolver()));
    
            configurationInstance = new Telerik.Reporting.Services.ReportServiceConfiguration
            {
                HostAppId = "Application1",
                ReportResolver = resolver,
                Storage = new Telerik.Reporting.Cache.File.FileStorage(),
            };
        }
    
        public CustomResolverReportsController()
        {
            this.ReportServiceConfiguration = configurationInstance;
        }
    }
  3. Request the report from the HTML5 Report Viewer on the client:

    JavaScript
    <script type="text/javascript">
        $(document).ready(function () {
                $("#reportViewer1").telerik_ReportViewer({
                    serviceUrl: "api/reports/",
                    reportSource: { report: 1 }                
            });
        });
    </script>

    where x.x.x.x is the version of the HTML5 ReportViewer/Telerik Reporting (e.g. 8.1.14.618).

  4. To create the database use the following script:

    USE [master]
    GO
    CREATE DATABASE [Reports]
    CONTAINMENT = NONE
    ON  PRIMARY
    ( NAME = N'Reports', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\Reports.mdf' , SIZE = 4096KB ,
    
    MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
    LOG ON
    ( NAME = N'Reports_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\Reports_log.ldf' , SIZE = 1024KB
    
    , MAXSIZE = 2048GB , FILEGROWTH = 10%)
    GO
    USE [Reports]
    GO
    CREATE TABLE [dbo].[Reports](
    [ID] [int] NOT NULL,
    [Definition] [nvarchar](max) NOT NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
  5. To enter some data into the database you can manually edit the Reports table. XML report definitions can be obtained from the sample .trdx report files installed together with the product and are located in [Telerik_Reporting_Install_Dir]\Report Designer\Examples.

    In newer versions, all sample reports of the Standalone Report Designer are in TRDP format. You can use the Standalone Report Designer - File - Save As option to convert them to TRDX files.