首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC ControllerContext,线程/任务,罗塔蒂瓦

MVC ControllerContext,线程/任务,罗塔蒂瓦
EN

Stack Overflow用户
提问于 2015-09-30 21:37:53
回答 3查看 1.6K关注 0票数 3

Rotativa 1.6.4继续在System.NullReferenceException中发布Rotativa.dll

具体而言,它发生在BuildPdf(上下文)上。

我尝试过线程、任务和其他背景类型的作业。为什么?PDF生成有时非常慢,而且使用ActionAsPdf (参见Here)时会出现错误,因此我希望将其拆分为一个新的线程/任务或后台作业,并且只会记录错误,这样我就可以让用户尽快返回。

BuildPdf接受当前控制器上下文,该上下文始终为null --我尝试使用httpcontext创建一个新的上下文,创建一个新的控制器实例,结果都是相同的。一旦它进入Rotativa.dll,上下文就完全消失了,无论是在成为线程/任务之前传递它,还是在调用BuildPdf()之前创建一个新的上下文;

在我开始线程/任务作业之前,或者在线程/任务作业中,我如何从一个有效的控制器上下文中获得一个有效的控制器上下文?

在这一点上,我已经准备好花真正的钱在一个真正的PDF解决方案,但到目前为止,他们似乎都是皮塔,只是一般的充其量,即使你有最简单的孩子需要PDF。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-30 21:44:13

您尝试过创建一个SynchronizationContext吗?

看来这个库是非线程安全的。

票数 0
EN

Stack Overflow用户

发布于 2016-01-24 17:37:03

我在处理同样的问题。我尝试过伪装ControllerContext,用MvcContrib创建FakeControllerContexts (正如在罗塔蒂瓦单元测试库中看到的那样),等等.但是所有的方法都给我带来了混乱,循环引用,而且它们在线程中没有很好的功能。

为了从模型调用函数,我最终使用了RazorEngine (用模型数据填充html )+ iTextSharp (将html转换为pdf),而不是罗塔蒂瓦。这在我的项目中创造了一个优雅的模板可能性(电子邮件,pdf,.)。

代码语言:javascript
复制
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;
        }

在模型中,我把它用作:

代码语言:javascript
复制
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)

票数 0
EN

Stack Overflow用户

发布于 2021-06-26 12:17:59

试试这个!!

代码语言:javascript
复制
Task.Factory.StartNew(() =>                  
 {
     Do Something here
 },
 CancellationToken.None,
 TaskCreationOptions.PreferFairness,
 TaskScheduler.FromCurrentSynchronizationContext() 
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32876042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档