Rotativa 1.6.4继续在System.NullReferenceException中发布Rotativa.dll
具体而言,它发生在BuildPdf(上下文)上。
我尝试过线程、任务和其他背景类型的作业。为什么?PDF生成有时非常慢,而且使用ActionAsPdf (参见Here)时会出现错误,因此我希望将其拆分为一个新的线程/任务或后台作业,并且只会记录错误,这样我就可以让用户尽快返回。
BuildPdf接受当前控制器上下文,该上下文始终为null --我尝试使用httpcontext创建一个新的上下文,创建一个新的控制器实例,结果都是相同的。一旦它进入Rotativa.dll,上下文就完全消失了,无论是在成为线程/任务之前传递它,还是在调用BuildPdf()之前创建一个新的上下文;
在我开始线程/任务作业之前,或者在线程/任务作业中,我如何从一个有效的控制器上下文中获得一个有效的控制器上下文?
在这一点上,我已经准备好花真正的钱在一个真正的PDF解决方案,但到目前为止,他们似乎都是皮塔,只是一般的充其量,即使你有最简单的孩子需要PDF。
发布于 2015-09-30 21:44:13
您尝试过创建一个SynchronizationContext吗?
看来这个库是非线程安全的。
发布于 2016-01-24 17:37:03
我在处理同样的问题。我尝试过伪装ControllerContext,用MvcContrib创建FakeControllerContexts (正如在罗塔蒂瓦单元测试库中看到的那样),等等.但是所有的方法都给我带来了混乱,循环引用,而且它们在线程中没有很好的功能。
为了从模型调用函数,我最终使用了RazorEngine (用模型数据填充html )+ iTextSharp (将html转换为pdf),而不是罗塔蒂瓦。这在我的项目中创造了一个优雅的模板可能性(电子邮件,pdf,.)。
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html.simpleparser;
...
public class PDFHelper {
public static byte[] GetPDFGromHTMLString(string pHTML) {
byte[] bPDF = null;
MemoryStream ms = new MemoryStream();
TextReader txtReader = new StringReader(pHTML);
// 1: create object of a itextsharp document class
Document doc = new Document(PageSize.A4, 25, 25, 25, 25);
// 2: we create a itextsharp pdfwriter that listens to the document and directs a XML-stream to a file
PdfWriter oPdfWriter = PdfWriter.GetInstance(doc, ms);
// 3: we create a worker parse the document
HTMLWorker htmlWorker = new HTMLWorker(doc);
// 4: we open document and start the worker on the document
doc.Open();
htmlWorker.StartDocument();
// 5: parse the html into the document
htmlWorker.Parse(txtReader);
// 6: close the document and the worker
htmlWorker.EndDocument();
htmlWorker.Close();
doc.Close();
bPDF = ms.ToArray();
return bPDF;
}在模型中,我把它用作:
using RazorEngine;
using RazorEngine.Templating;
...
string razorText = System.IO.File.ReadAllText(HostingEnvironment.MapPath(@"~/Views/MyReport.cshtml"));
string body = Razor.Parse(razorText, model);
byte[] pdfBinary = MyFramework.PDFHelper.GetPDFGromHTMLString(body);
/**other stuff */如果您不想在RequestContext中处理RazorEngine,就不应该使用Html帮助器(更改@Html.DisplayFor(模型=> .)致@Model.MyProperty)
发布于 2021-06-26 12:17:59
试试这个!!
Task.Factory.StartNew(() =>
{
Do Something here
},
CancellationToken.None,
TaskCreationOptions.PreferFairness,
TaskScheduler.FromCurrentSynchronizationContext()
);https://stackoverflow.com/questions/32876042
复制相似问题