Die Generierung von Telerik-Berichten schlägt in IIS auf Azure VM mit OperationCanceledException fehlC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Die Generierung von Telerik-Berichten schlägt in IIS auf Azure VM mit OperationCanceledException fehl

Post by Anonymous »

Ich habe eine ASP.NET Core-Web-API, die Berichte mithilfe von Telerik Reporting generiert. Die Berichtserstellung funktioniert in meiner lokalen Entwicklungsumgebung einwandfrei, schlägt jedoch bei der Bereitstellung auf einer Azure-VM mit IIS sofort mit OperationCanceledException fehl. Der Vorgang wartet nicht einmal auf das konfigurierte 5-Minuten-Timeout.
Das Problem tritt sporadisch auf. Es funktioniert manchmal, funktioniert aber plötzlich nicht mehr ohne Codeänderungen.
Fehler-Stack-Trace:

Code: Select all

The operation was canceled.
at System.Threading.CancellationToken.ThrowOperationCanceledException()
at System.Threading.ManualResetEventSlim.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.SpinThenBlockingWait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.InternalWaitCore(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait(CancellationToken cancellationToken)
at Telerik.Reporting.Paging.PageCompositionBase.SeparateThreadOutputBehavior.Finish()
at Telerik.Reporting.Paging.PageCompositionBase.CreatePages()
at Telerik.Reporting.Paging.PagerBase.Telerik.Reporting.Paging.IPager.CreatePages(IPageHandler handler, LayoutElement root)
at Telerik.Reporting.BaseRendering.RenderingExtensionBase.Render(LayoutElement root, Hashtable renderingContext, Hashtable deviceInfo, CreateStream createStreamCallback, EvaluateHeaderFooterExpressions evalHeaderFooterCallback, PageSettings pageSettings)
at Telerik.Reporting.BaseRendering.RenderingExtensionBase.Render(Report report, Hashtable renderingContext, Hashtable deviceInfo, CreateStream createStreamCallback, EvaluateHeaderFooterExpressions evalHeaderFooterCallback)
at Telerik.Reporting.Processing.ReportProcessor.RenderCore(ExtensionInfo extensionInfo, IList`1 processingReports, Hashtable deviceInfo, IRenderingContext renderingContext, CreateStream createStreamCallback)
at Telerik.Reporting.Processing.ReportProcessor.ProcessAndRender(String format, ReportSource reportSource, Hashtable deviceInfo, IRenderingContext renderingContext, CreateStream createStreamCallback)
at Telerik.Reporting.Processing.ReportProcessor.ProcessAndRenderStateless(String format, ReportSource reportSource, Hashtable deviceInfo, IRenderingContext renderingContext, CreateStream createStreamCallback)
at Telerik.Reporting.Processing.ReportProcessor.RenderReport(String format, ReportSource reportSource, Hashtable deviceInfo, CreateStream createStreamCallback, CancellationToken cancellationToken, String& documentName)
Hier ist der Code für die Berichtserstellung:

Code: Select all

public SalesSummaryDataOutput SalesSummaryReport(SalesReportSummaryRequest requestReport)
{
string reportPath = "\\Reports\\"  + ReportTypes.SalesSummary.ToString() + ".trdx";
var reportProcessor = new ReportProcessor();
var deviceInfo = new Hashtable();
var reportSource = new UriReportSource();

reportSource.Uri = _hostEnvironment.ContentRootPath + reportPath;
reportSource.Parameters.Add("FromDate", requestReport.FromDate);
reportSource.Parameters.Add("ToDate", requestReport.ToDate);
reportSource.Parameters.Add("CompanyId", requestReport.CompanyId);
reportSource.Parameters.Add("LocationId", requestReport.LocationId);
reportSource.Parameters.Add("UserId", requestReport.UserId);
reportSource.Parameters.Add("ExecuteReport", true);

deviceInfo["OutputFormat"] = "PNG";
deviceInfo["DpiX"] = 192;
deviceInfo["DpiY"] = 192;
deviceInfo["Timeout"] = 300000;
deviceInfo["ThreadCulture"] = CultureInfo.CurrentCulture.Name;

try
{
CloseStreams();
string documentName = "ReportDocument";
var cts = new CancellationTokenSource(TimeSpan.FromMinutes(5));
bool result = reportProcessor.RenderReport("IMAGE", reportSource, deviceInfo, CreateStream, cts.Token, out documentName);

if (result)
{
var salesSummaryReport = new SalesSummaryDataOutput();

foreach (var stream in _streams)
{
byte[] imageData = ReadToEnd(stream);
string base64String = Convert.ToBase64String(imageData, 0, imageData.Length);
salesSummaryReport.ReportImages.Add(base64String);
}

CloseStreams();
return salesSummaryReport;
}
}
catch (Exception ex)
{
var salesSummaryReport = new SalesSummaryDataOutput();
salesSummaryReport.ReportImages.Add($"Error: {ex.Message}");
CloseStreams();
return salesSummaryReport;
}

return new SalesSummaryDataOutput();
}
Warum erfolgt der Abbruch sofort in IIS, aber nicht lokal?
Was könnte dieses intermittierende Verhalten verursachen?
Gibt es bestimmte IIS- oder Telerik-Konfigurationen, die mir fehlen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post