翻譯|使用教程|編輯:龔雪|2023-10-18 10:45:21.250|閱讀 113 次
概述:本文主要介紹如何完成Telerik Reporting REST服務(wù)和報(bào)表服務(wù)器的切換,歡迎下載最新版組件體驗(yàn)!
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Telerik Reporting擁有直觀、無代碼的Win、網(wǎng)頁與PDF報(bào)表的創(chuàng)建功能,直觀的設(shè)計(jì)與具有特定風(fēng)格的報(bào)表,無代碼數(shù)據(jù)打包、向?qū)А⒄Z法開發(fā)工具、自動(dòng)操作。分類整理、過濾、有條件格式化、轉(zhuǎn)化器格式,活動(dòng)報(bào)表,水晶報(bào)表,附加報(bào)表。
本文主要目的是展示在這兩種呈現(xiàn)報(bào)表的方法(Telerik Report Server (TRS)和Telerik Reporting REST)之間切換是多么容易,我們還將展示每種方法的優(yōu)缺點(diǎn),以及如何同時(shí)運(yùn)行兩種解決方案并在兩者之間切換。
需要注意的一點(diǎn)是:它需要一點(diǎn)設(shè)置,您需要有一個(gè)ASP. NET Core站點(diǎn),這用于通過HTML5 Telerik Report查看器調(diào)用TRS 和REST報(bào)表實(shí)例。
技術(shù)交流群:726377843 歡迎一起進(jìn)群討論
對(duì)于在TRS和REST報(bào)表之間切換的初始設(shè)置,我們需要做以下工作:
確保版本與ASP.NET Core站點(diǎn)上的Telerik Reporting版本匹配。
1. 這涉及到創(chuàng)建一個(gè)Telerik Reporting REST服務(wù)項(xiàng)目,注意:在本例中創(chuàng)建了一個(gè).NET Framework版本的Reporting REST服務(wù),這是因?yàn)橐呀?jīng)在.NET框架項(xiàng)目中使用了一些用戶函數(shù),這些函數(shù)在.NET Core環(huán)境中無法工作。另外注意:可以從.NET Core網(wǎng)站和.NET Core Worker調(diào)用.NET框架項(xiàng)目(也就是說不需要有一個(gè)UI來調(diào)用REST項(xiàng)目)。
(或者,您可以使用名為CSharp.NetFramework.ReportingRestServiceCorsDemo的項(xiàng)目。Csproj作為模板隨產(chǎn)品安裝一起分發(fā),如果您不熟悉CORS配置這可能會(huì)加快速度。注意:這可以通過初始的Visual Studio Project對(duì)話框使用。)
有必要用下面的代碼來修飾Controller類,否則就會(huì)出現(xiàn)CORS錯(cuò)誤。
[EnableCors(origins: "http://staging.buku.uk" , headers: "*", methods: "*") ] public class ReportsController : ReportsControllerBase
2. 另外,有必要將一些報(bào)表放在項(xiàng)目根目錄下的一個(gè)名為Reports的目錄中,您可以使用子目錄分隔報(bào)表。
3. 使用自定義報(bào)表解析器來修復(fù)由調(diào)用函數(shù)提供的連接字符串和參數(shù)。在大多數(shù)情況下,這是一個(gè)Telerik HTML5報(bào)表查看器,但是后臺(tái)任務(wù)可以從始終在線的Worker進(jìn)程中運(yùn)行。
注意:Booking.Data.NET.Classes.Configuration. _sBookingConnectionString屬性解析為基于_nServerInstance變量的連接字符串,即Dev, Staging或Live。
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Telerik.Reporting;
using Telerik.Reporting.Services;
using Booking.Library.NET.Classes;
namespace Booking.Reporting.NET.REST.Classes
{
public class CustomReportSourceResolver : IReportSourceResolver
{
public string ReportsPath { get; set; }
public CustomReportSourceResolver(string reportsPath)
{
this.ReportsPath = reportsPath;
}
public ReportSource Resolve(string reportId, OperationOrigin operationOrigin, IDictionary<string, object> currentParameterValues)
{
try
{
string reportPath = Path.Combine(this.ReportsPath, reportId);
var reportPackager = new ReportPackager();
Report report = null;
using (var sourceStream = System.IO.File.OpenRead(reportPath))
{
report = (Report)reportPackager.UnpackageDocument(sourceStream);
}
if (currentParameterValues.Any(CPV => CPV.Key == "nServerInstance"))
{
var lnServerInstance = currentParameterValues.Where(CPV => CPV.Key == "nServerInstance").FirstOrDefault().Value;
Booking.Data.NET.Classes.Configuration._nServerInstance = (int)(long)lnServerInstance;
}
ReportConnectionStringManager loReportConnectionStringManager = new ReportConnectionStringManager(Booking.Data.NET.Classes.Configuration._sBookingConnectionString);
ReportSource loReportSource = loReportConnectionStringManager.UpdateReportSource(new InstanceReportSource() { ReportDocument = report });
foreach (var parameter in currentParameterValues)
{
loReportSource.Parameters.Add(parameter.Key, parameter.Value);
}
return loReportSource;
}
catch (System.Exception loException)
{
Logger.LogException(loException);
}
return null;
}
}
}
選擇其中一個(gè)或另一個(gè)的利弊主要與成本有關(guān)。雖然TRS是物有所值的,但一些客戶有預(yù)算限制,可能會(huì)在某些條件下妨礙銷售。Buku平臺(tái)被設(shè)計(jì)為在客戶端基礎(chǔ)設(shè)施上運(yùn)行,客戶端希望這樣做(即,他們自己的服務(wù)器和網(wǎng)絡(luò),以及產(chǎn)品,可以完全運(yùn)行在Windows筆記本電腦上)。所以,如果發(fā)現(xiàn)一個(gè)想要運(yùn)行軟件的客戶,他們也必須購買TRS,他們的成本就會(huì)顯著上升。
REST解決方案可以呈現(xiàn)與TRS解決方案相同的報(bào)表,客戶端唯一的成本是硬盤空間和計(jì)算機(jī)功率。(在TRS下面是REST服務(wù)的實(shí)現(xiàn),它使這種切換場(chǎng)景變得輕松。)請(qǐng)注意,還將有一個(gè)云版本,客戶可以在其中注冊(cè)使用該產(chǎn)品,并且數(shù)據(jù)位于安全的云中。
TRS解決方案在能夠從服務(wù)器本身運(yùn)行報(bào)表方面有一些額外的優(yōu)勢(shì),盡管我們沒有在Buku平臺(tái)中完全使用這個(gè)特性,客戶只能看到Buku平臺(tái)報(bào)表引擎。目前官方正在計(jì)劃一個(gè)額外的Reporting模塊,它將允許用戶根據(jù)預(yù)編程的數(shù)據(jù)源設(shè)計(jì)自定義報(bào)表。
因此 HTML5 Report Viewer 的配置方式是設(shè)計(jì)考慮的因素之一,它可以在TRS和REST之間來回切換。
下面是報(bào)表查看器的頂部,有幾點(diǎn)需要注意:
1. TRS具有不需要登錄憑據(jù)的來賓模式,從URL下面的行中可以看到這一點(diǎn)。
2. REST沒有身份驗(yàn)證方法,但是將憑據(jù)行保留在原來的位置會(huì)被忽略。
3. TRS數(shù)據(jù)源由TRS數(shù)據(jù)連接器控制,它實(shí)際上是一個(gè)連接字符串。對(duì)于一些較小的報(bào)表,也有一些對(duì)象數(shù)據(jù)源。
4. REST程序總是使用_nServerInstance安排來確定連接字符串,這取決于是Dev、Staging還是Live。
5. 不同類型的報(bào)表具有不同類型和數(shù)量的參數(shù),但是有些報(bào)表使用相同的參數(shù)和參數(shù)類型,可以對(duì)多個(gè)報(bào)表使用相同的塊將它們組合在一起。
$(document).ready(function () {
$("#rvMain").telerik_ReportViewer({
reportServer: {
url: "@this.Model._sReportingUrl",
username: null,
password: null
},
reportSource: {
report: '@this.Model._sReport',
parameters: {
@switch ((Booking.Library.Classes.Enums.Reports)this.Model._nReport)
{
case Booking.Library.Classes.Enums.Reports.AdHocSLInvoice1:
case Booking.Library.Classes.Enums.Reports.AdHocSLInvoice2:
case Booking.Library.Classes.Enums.Reports.AdHocSLCreditNote1:
case Booking.Library.Classes.Enums.Reports.AdHocSLCreditNote2:
case Booking.Library.Classes.Enums.Reports.AdHocPLInvoice1:
case Booking.Library.Classes.Enums.Reports.AdHocPLInvoice2:
case Booking.Library.Classes.Enums.Reports.AdHocPLCreditNote1:
case Booking.Library.Classes.Enums.Reports.AdHocPLCreditNote2:
case Booking.Library.Classes.Enums.Reports.AdHocPLPayment:
case Booking.Library.Classes.Enums.Reports.AdHocSLReceipt:
{
<text>
nServerInstance: @Booking.Data.Classes.Configuration._nServerInstance,
gTransactionId: '@this.Model._gId.ToString()',
gCompanyId: gCompanyId,
sCulture: sCompanyCulture
</text>
}
break;
case Booking.Library.Classes.Enums.Reports.AdHocDisbursementBatch:
{
<text>
nServerInstance: @Booking.Data.Classes.Configuration._nServerInstance,
gBatchId: '@this.Model._gId.ToString()',
sCulture: sCompanyCulture
</text>
}
break;
case Booking.Library.Classes.Enums.Reports.DisbursementBatch:
{
<text>
nServerInstance: @Booking.Data.Classes.Configuration._nServerInstance,
gCompanyId: gCompanyId,
dStart: kendo.parseDate('@this.Model._dStart.ToString("dd/MM/yyyy")', "dd/MM/yyyy"),
dEnd: kendo.parseDate('@this.Model._dEnd.Date.AddDays(1).ToString("dd/MM/yyyy")', "dd/MM/yyyy"),
bPosted: '@this.Model._bPosted.ToString().ToLower()',
nReport: @this.Model._nReport,
bAll: '@this.Model._bAll.ToString().ToLower()' == 'true',
sCulture: sCompanyCulture
</text>
}
break;
case Booking.Library.Classes.Enums.Reports.AdHocJournalBatch:
在某些方面,REST報(bào)表有一種更簡單的機(jī)制來保持報(bào)告的最新狀態(tài),磁盤上的報(bào)表是最新的,并且總是保存回磁盤,TRS報(bào)告需要發(fā)布回服務(wù)器。
為了管理切換,我使用了兩個(gè)控件,一個(gè)開關(guān)和一個(gè)TRS / REST Url字段。開關(guān)就是簡單的TRS開或關(guān),包含Url的字段將用于TRS //trs.buku.uk和REST //rs.buku.uk(報(bào)表暫存(RS))。
在使用REST后切換回TRS有點(diǎn)麻煩,因?yàn)閳?bào)表在TRS上經(jīng)常不是最新的,所以需要再次推送。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自:慧都網(wǎng)