使用用户构建的模板生成服务器中的## Rotativa问题pdf生成

时间:2017-09-18 09:23:03

标签: c# .net pdf wkhtmltopdf rotativa

我正在使用c#.net开发企业应用程序。系统中生成了许多pdf文档。我使用Rotativa进行pdf处理。有一个pdf在系统中使用用户创建的模板。系统从系统获取数据并使用来自服务器的动态值替换模板变量并下载pdf。这个特殊的pdf在我的本地和开发服务器上工作正常,但在生产服务器中失败了。如果有人能提供帮助,我们会很高兴。我附加了错误和代码。请看看。

public ActionResult GenerateRedemptionLetterGift(int id, int templateId)
    {
        try
        {
            int RedTempId = templateId; //Convert.ToInt32(Request.QueryString["templateId"]); 
            int type = 2;
            RedemptionCode RedemptionObj = new RedemptionCode();
            RedemptionObj = BlObj.GetRedemptionDetail(id);
            return new Rotativa.MVC.ActionAsPdf("ReturnTemplate", new { id, RedTempId, type }) { FileName = "Redemption_Letter_" + RedemptionObj.Id.ToString() + ".pdf" };
        }
        catch (Exception ex)
        {
            throw new Exception("Main Method", ex);
        }
    }

这里我将函数ReturnTemplate称为ActionAsPdf,其中所有数据都在用户创建的模板中被提取和替换。

public ActionResult ReturnTemplate(int id, int RedTempId, int type)
    {
        try
        {
            RedemptionTemplateBO RedTemp = new RedemptionTemplateBO();
            RedTemp = BlObj.GetRedemptionTemplateForEdit(RedTempId);
            Hashtable TempStrings = new Hashtable();

            if (type == 1)
            {
                TempStrings = GenerateRedemptionHashTable(id);
            }
            else if (type == 2)
            {
                TempStrings = GenerateRedemptionHashTableGift(id);
            }

            StringBuilder builder = new StringBuilder();
            builder.Append("<html><head><title>Redemption Letter</title></head><body><style> @font-face {font-family: myFirstFont;src: url(~/fonts/Roboto-Regular.ttf);} p{font-family: 'Roboto', sans-serif;color: #3e3e3e;font-size: 15px;font-weight: 400;margin-bottom: 10px}</style>");
            builder.Append(RedTemp.TemplateContent);
            builder.Append("</body></html>");
            foreach (string key in TempStrings.Keys)
            {
                builder.Replace("[" + key + "]", (string)TempStrings[key]);
            }
            return Content(builder.ToString());
        }
        catch( Exception ex)
        {
            throw new Exception("Return Template", ex);

        }
     }

我已经使用断点检查了本地,如果我在字符串中获取正确的数据以便在第二种方法中返回。它即将到来。

它在本地和开发服务器上运行良好。我得到了预期的pdf。

但是当我在生产中运行它时。我遇到了一个错误,它似乎也没有碰到try catch块。

“/”应用程序中的服务器错误。 错误:加载页面http://app.com/Redemption/ReturnTemplate/185?RedTempId=3&type=2失败(有时它只会忽略此错误并使用--load-error-handling ignore) 由于网络错误退出代码1:RemoteHostClosedError 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息:System.Exception:错误:加载页面http://app.com/Redemption/ReturnTemplate/185?RedTempId=3&type=2失败(有时它只会忽略此错误并使用--load-error-handling ignore) 由于网络错误退出代码1:RemoteHostClosedError

这是最后几个堆栈跟踪

 Rotativa.Core.WkhtmltopdfDriver.Convert(DriverOptions options, String html) +793
 Rotativa.MVC.AsPdfResultBase.CallTheDriver(ControllerContext context) +27
 Rotativa.MVC.AsPdfResultBase.BuildPdf(ControllerContext context) +203
 Rotativa.MVC.AsPdfResultBase.ExecuteResult(ControllerContext context) +27

WkhtmltopdfDriver需要很长时间才能从生产服务器响应。

可能是由于Rotativa服务器中的一些传出呼叫。但是我的其他pdf代仍然可以在生产服务器中使用rotativa。

1 个答案:

答案 0 :(得分:0)

我们有一个类似但不同的错误:Failed loading page:...HostNotFoundError

基本上,rotativa试图从Intranet内解析域名,但是该特定网络不允许您使用其绑定的域名访问其面向公众的站点。切换到.UrlAsAPdf并使用Intranet IP地址,此问题已解决。

还要先在本地测试PDF视图/页面,以查看它在做什么。