jsreport.Client
is c# client for the jsreport REST API. It represents convenient way to remotely access jsreport server instance and invoke report rendering using simple c# code. It is compatible with the on premise, jsreportonline as well as .net local instances. The jsreport.Client
is implemented as .NET Standard library so it should run pretty much everywhere the .Net Standard 1.6
or higher is implemented.
The most common scenario is that you first design a report template using jsreport studio and save it on the jsreport server. Later you want to initiate the rendering from c# and provide the real data.
var rs = new ReportingService("http://localhost:5488");
var report = await rs.RenderByNameAsync("Invoice", new
{
Id = 123,
From = "Erich Gamma",
To = "Martin Fowler"
});
The usage with jsreportonline is pretty much the same, just with different url and with provided credentials.
var rs = new ReportingService("https://[subdomain].jsreportonline.net", "email", "password");
The rendering output includes the report stream report.Content
and additional report.Meta
object that contains many helpful information like content type, number of produced pdf pages or logs.
If you want to have the full control on the template rendering you can use RenderAsync
overload which accepts RenderRequest
instance allowing you to fill bunch of other options.
You should use this overload if you for example don't store templates in jsreport server but rather in your own storage. In this case you can send the whole template specification without referencing the existing one by its name.
Here you can see how you can convert html to xlsx and use a templating engine to dynamically inject values into the output without storing template in jsreport store.
var report = await rs.RenderAsync(new RenderRequest()
{
Template = new Template()
{
Recipe = Recipe.HtmlToXlsx,
Engine = Engine.Handlebars,
Content = "<table><tr><td>Hello {{message}}</td></td>"
},
Data = new
{
message = "world!"
}
});
The output report.Meta.Logs
includes valuable information from the rendering process. You can find there not only the jsreport logs but also javascript errors or console.log
entries. This is very valuable when troubleshooting the rendering without using jsreport studio.
The types like RenderRequest
or Template
are installed using the package jsreport.Types. The releases of this package match the jsreport releases therefore you should be able to install correct types if you for some reason need to connect to an older version of jsreport.
The types contains complete set of entities and properties used to define the request. This means you can for example configure pdf-utils extension to merge multiple pdfs during rendering.
rs.RenderAsync(new RenderRequest {
Template = new Template()
{
Content = "Helo world",
Engine = Engine.Handlebars,
Recipe = Recipe.ChromePdf,
Chrome = new Chrome
{
MarginTop = "2cm"
},
PdfOperations = new List<PdfOperation>()
{
new PdfOperation()
{
Type = PdfOperationType.Merge,
Template = new Template
{
Content = "header",
Engine = Engine.None,
Recipe = Recipe.ChromePdf
}
}
}
}
});
Another example shows how to use the reports extension to store the output report for later use.
var invoiceResult = await rs.RenderAsync(new RenderRequest
{
Template = new Template
{
Name = "Invoice"
},
Data = InvoiceData,
Options = new RenderOptions
{
Reports = new ReportsOptions
{
Save = true
}
}
});
Console.WriteLine(invoiceResult.Meta.ReportPermanentLink);
You can also use the async option and then check the invoiceResult.Meta.AsyncReportLocation
property.
The provided types only includes the attributes used by the official extensions. However you can also simply use RenderRequest.Overwrites
property to pass your own data to the request.
var report = await rs.RenderAsync(new RenderRequest()
{
...
Overwrites = new
{
Template = new
{
MyTemplateCustomProperty = "foo"
}
}
});
ReportingService
uses .NET HttpClient
to make http calls. This library has default timeout of 100seconds for a request. This doesn't have to be enough for bigger reports therefore you may need to change this default timeout.
reportingService.HttpClientTimeout = TimeSpan.FromMinutes(10);
Waiting for .net core support in
Simple.OData.Client
- follow this issue.
jsreport API for doing CRUD on entities is based on odata and you can use great Simple.OData.Client library to consume it.
var client = new ODataClient("http://localhost:5488/odata");
var metadata = client.GetMetadataAsync().Result;
To understand jsreport entities checkout jsreport API metadata at https://[jsreport address]/odata/$metadata
. You can find many examples how to work with odata cliet here.
var template = await client.For<Template>()
.Filter(x => x.shortid == "Report1")
.FindEntryAsync();
var template = await client.For<Template>()
.Filter(x => x.shortid == "Report1")
.FindEntryAsync();
await client.For<Template>()
.Key(template._id)
.Set(new {
_id = template._id,
content = "Some modified content"
})
.UpdateEntryAsync();