本文将指导您如何托管报表 Web 服务,以便将报表生成引擎公开给 .NET 5 Web 应用程序中的 ASP.NET Core。

出于可读性原因,本指南分为多个部分。随着步骤,它详细阐述了每个步骤背后的概念和理论。

先决条件

Visual Studio 2019,版本 16.8+

.Net 5 开发工具包

在 .NET 5 项目中创建示例 ASP.NET Core

首先,您需要创建一个新的 ASP.NET Core 项目:

打开Visual Studio 2019。

从文件菜单中,选择新建 > 项目。

在“添加新项目”对话框中,选择ASP.NET Core Web 应用程序项目模板。为项目选择一个名称和位置,然后单击Create。

在Create a new ASP.NET Core web application对话框中,从下拉列表中选择.NET Core和ASP.NET Core 5.0。单击“创建”。

添加报告定义

在本教程中,生成的服务将使用通过 Telerik Reporting 产品安装程序部署的示例报告定义:

在{Telerik Reporting 安装路径}\Report Designer\Examples 中找到示例报告 。

将一个名为Reports的新文件夹添加到您的解决方案中,并将所有示例报告复制到其中。

在本教程的后面,我们将确保 ReportsController 能够解析此项目文件夹中请求的报告的定义。



建议使用使用独立报表设计器 或概览编写的声明性定义 (TRDP/TRDX/TRBP)以利用它们的设计时工具,因为 VS 集成报表设计器工具在 .NET 5 项目中仍然不可用.


添加所需的依赖项

本指南应用推荐的 NuGet 包引用方法来添加依赖项:

参考Telerik.Reporting.Services.AspNetCore(或Telerik.Reporting.Services.AspNetCore.Trial)包。

或者,要启用 Office OpenXML 文档格式(XLSX、DOCX 和 PPTX)作为导出选项,请参考 Telerik.Reporting.OpenXmlRendering(或Telerik.Reporting.OpenXmlRendering.Trial)NuGet 包。



添加必要依赖项的推荐方法是使用 Progress Telerik 专有 NuGet 源 并将依赖项作为 NuGet 包引用。这也会将间接依赖项添加到您的项目中,从而带来更轻松的依赖项管理。

或者,程序集 位于 Telerik Reporting 安装目录的\Bin\net5.0\文件夹中。但是,这需要手动添加.NET Core 支持部分的要求部分中列出的所有间接依赖项以及以下依赖项包: Microsoft.AspNetCore.Mvc.NewtonsoftJson 5.0.0 版 和 DocumentFormat.OpenXML 2.7.2.0 版或以上。请注意,您只需要最后一个引用来启用 Office OpenXML 文档格式。

报告引擎依赖于 Windows 操作系统上可用的 GDI+ API。在 Linux 和 macOS 上,我们改用名为libgdiplus 的库 。GDI+ API 需要用于测量、布局、渲染文本字形和图像。



PS:我用的是开发版的,所以不能使用NuGet,除了上面提到的net5.0文件夹用到的dll以外,还需要引用netstandard2.0下面的Telerik.Reporting.dll,见截图


Telerik Reporting:如何在 .NET 5 中的 ASP.NET Core 中托管Reports Service_asp.netTelerik Reporting:如何在 .NET 5 中的 ASP.NET Core 中托管Reports Service_.net_02

 

 

 引用的DLL一定要设置复制本地为:是(true)

 Telerik Reporting:如何在 .NET 5 中的 ASP.NET Core 中托管Reports Service_asp.net_03

 

 

 

为报告服务设置 Startup.cs 文件

该ConfigureServices里面方法Startup.cs项目应以使报表服务功能进行修改。

确保应用程序配置的WebAPI控制器并调用AddNewtonsoftJson的IMvcBuilder对象放置NewtonsoftJson序列上:



services.AddControllers().AddNewtonsoftJson();


在依赖容器中添加报告服务所需的专用配置对象。请注意报告源解析器如何将我们之前创建的 Reports 文件夹作为目标。



// Configure dependencies for ReportsController.
services.TryAddSingleton<IReportServiceConfiguration>(sp =>
new ReportServiceConfiguration
{
ReportingEngineConfiguration = ConfigurationHelper.ResolveConfiguration(sp.GetService<IWebHostEnvironment>()),
HostAppId = "Net5RestServiceWithCors",
Storage = new FileStorage(),
ReportSourceResolver = new UriReportSourceResolver(
System.IO.Path.Combine(sp.GetService<IWebHostEnvironment>().ContentRootPath, "Reports"))
});


通过在 lambda 表达式参数中添加以下行,确保为 API 控制器配置Startup.cs 的Configure方法中的端点配置:



app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
// ...
});


添加配置设置(可选)

报告生成引擎可以检索 Sql 连接字符串和提供部署应用程序灵活性的特定报告生成引擎设置。 为此,它使用 IConfiguration 接口。

.NET 5 应用程序使用 默认命名的基于键值 JSON 的文件appSettings.json。默认的 ReportingEngineConfiguration:



ReportingEngineConfiguration = sp.GetService<IConfiguration>()


将从appSettings.json或 appsettings.{EnvironmentName}.json初始化。

为了用不同的名称激活JSON文件结构中,例如,reportingAppSettings.json,调用 ​​AddJsonFile​​ 上的一个实例扩展方法 ​​ConfigurationBuilder​​。

在本指南中,我们将创建一个加载 json 格式设置的辅助类:



using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;

static class ConfigurationHelper
{
public static IConfiguration ResolveConfiguration(IWebHostEnvironment environment)
{
var reportingConfigFileName = System.IO.Path.Combine(environment.ContentRootPath, "reportingAppSettings.json");
return new ConfigurationBuilder()
.AddJsonFile(reportingConfigFileName, true)
.Build();
}
}


最后,所有配置都应该放在 JSON 配置文件中(如果不存在,则在项目根目录中添加一个)。例如,ConnectionStrings设置应以基于 JSON 的格式进行配置,如下所示:



{
...
"ConnectionStrings": {
"Telerik.Reporting.Examples.CSharp.Properties.Settings.TelerikConnectionString": "Data Source=.\\SQLEXPRESS;Initial Catalog=AdventureWorks;Integrated Security=true"
}
}


上述类型的连接字符串缺少有关数据提供者的信息,将使用System.Data.SqlClient 作为提供者不变名称。当需要指定不同的数据提供者时,还支持以下表示法:



{
...
"ConnectionStrings": {
"Telerik.Reporting.Examples.CSharp.Properties.Settings.TelerikConnectionString": {
"connectionString": "Data Source=.\\SQLEXPRESS;Initial Catalog=AdventureWorks;Integrated Security=true",
"providerName": "System.Data.SqlClient"
}
}
}


上面指定的两种类型的连接字符串表示法可以在单个 ConnectionStrings 部分中共存。

ConnectionStrings配置 的最后一种支持类型使用一个数组来提供有关每个连接字符串的信息:



{
...
"ConnectionStrings": [
{
"name": "Telerik.Reporting.Examples.CSharp.Properties.Settings.TelerikConnectionString",
"connectionString": "Data Source=.\\SQLEXPRESS;Initial Catalog=AdventureWorks;Integrated Security=true",
"providerName": "System.Data.SqlClient"
}
]
}


设置 REST 服务

创建文件夹Controllers。右键单击项目名称并选择Add > New folder。将其命名为Controllers。

实现报告控制器。右键单击Controllers 文件夹并添加一个新项目:添加 > 新项 > Web API 控制器类项目。将其命名为ReportsController。这将是我们项目中的 Telerik Reporting REST 服务。

继承ReportsControllerBase类型并在构造函数中注入配置设置。控制器的基本实现应该是这样的:



namespace CSharp.Net5.ReportingRestServiceCorsDemo.Controllers
{
using Microsoft.AspNetCore.Mvc;
using System.Net;
using System.Net.Mail;
using Telerik.Reporting.Services;
using Telerik.Reporting.Services.AspNetCore;

[Route("api/reports")]
public class ReportsController : ReportsControllerBase
{
public ReportsController(IReportServiceConfiguration reportServiceConfiguration)
: base(reportServiceConfiguration)
{
}

protected override HttpStatusCode SendMailMessage(MailMessage mailMessage)
{
throw new System.NotImplementedException("This method should be implemented in order to send mail messages");

//using (var smtpClient = new SmtpClient("smtp01.mycompany.com", 25))
//{
// smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
// smtpClient.EnableSsl = false;

// smtpClient.Send(mailMessage);
//}
//return HttpStatusCode.OK;
}
}
}


测试服务实现

为确保服务运行,请运行应用程序并导航到 URL {applicationRoot}/api/reports/formats。它应该返回一个表示支持的渲染扩展的 JSON。

演示项目

完整示例可以在 Telerik Reporting 的安装文件夹中找到:C:\Program Files (x86)\Progress\Telerik Reporting {Version}\Examples\CSharp\.NET 5\RestServiceCorsNet5Demo(PS:调试失败,看看就行了)

启用跨域资源共享 (CORS)(可选)---------我没测试成功

您可能需要启用跨域资源共享 (CORS),例如,如果您使用来自不同域中托管的客户端的 REST 服务。

将以下代码添加到Startup.cs文件的ConfigureServices方法中, 为 REST 服务添加新的 CORS 策略:



services.AddCors(corsOption => corsOption.AddPolicy(
"ReportingRestPolicy",
corsBuilder =>
{
corsBuilder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));


通过 在Startup.cs文件的Configure方法中添加下一个代码来激活应用程序的上述策略:



app.UseCors( "ReportingRestPolicy" );


以上只是搭建了报表服务,客户端使用不包含在其中

https://docs.telerik.com/reporting/telerik-reporting-rest-service-aspnetcore-net5#how-to-host-reports-service-in-asp-net-core-in-net-5