Создание PDF-файла в фоновом задании (без HttpContext или ControllerContext) C# и Rotativa ASP.NET CoreC#

Место общения программистов C#
Anonymous
Создание PDF-файла в фоновом задании (без HttpContext или ControllerContext) C# и Rotativa ASP.NET Core

Сообщение Anonymous »

Похоже, что для создания PDF-файла из представления необходимо использовать метод BuildFile(ControllerContext context), который требует ControllerContext в качестве входного аргумента.
Итак, что мы можем сделать, если нет HttpContext, например, рассмотрим сценарий, в котором вы собираетесь создать несколько PDF-файлов и отправить их по электронной почте некоторым клиентам в фоновом задании (например, IHostedService)? Есть ли обходной путь?
Я хочу иметь возможность отправлять электронные письма с вложенным PDF-файлом, созданным с помощью Rotativa ASP.NET Core, каждые 2 часа, но при этом возникает проблема. из IHostedService, но если это сделать с помощью кнопки из представлений, это работает правильно.
Похоже, проблема в этой строке, поскольку ControllerContext null.
Это мой код:
public async Task EnviarParosPorCorreo(DateTime FechaInicio, DateTime FechaFinal)
{
var modelo = new VMReporteParo
{
Datos_Paros = Datos_Paro,
Acumulado_Paro = Acu_Paro,
Fallas = Fallas
};

var actionPDF = new ViewAsPdf("ImprimirParos", modelo)
{
CustomSwitches = "--enable-javascript --no-stop-slow-scripts --javascript-delay 3000 --page-size Letter --margin-top 2 --margin-right 0 --margin-bottom 0 --margin-left 0",
PageSize = Rotativa.AspNetCore.Options.Size.Letter,
PageOrientation = Rotativa.AspNetCore.Options.Orientation.Portrait,
PageMargins = { Left = 1, Right = 1 }
};

byte[] pdfData;

using (var pdfStream = new MemoryStream())
{
pdfData = await actionPDF.BuildFile(ControllerContext);
}

EnviarCorreo(pdfData);

return Ok("Correo enviado exitosamente.");
}

public Task StartAsync(CancellationToken cancellationToken)
{
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromHours(2)); // Run every 2 hours
return Task.CompletedTask;
}

private async void DoWork(object state)
{
using (var scope = _serviceProvider.CreateScope())
{
var reportsController = scope.ServiceProvider.GetRequiredService();

var startDate = DateTime.Now.Date;
var endDate = DateTime.Now.Date.AddDays(1).AddTicks(-1);

await reportsController.SendParosByMail(startdate, enddate);
}
}


Подробнее здесь: https://stackoverflow.com/questions/788 ... rcontext-c

Вернуться в «C#»