GDI+ 中发生一般性错误。在 Azure Web 应用程序上
A generic error occurred in GDI+. on Azure Webapp
我正在使用 spire lib 为用户创建 pdf 文件。
string userId = User.Identity.GetUserId();
User trainee = _userDAL.GetUserByIdentityId(userId);
// Get the Employee scores
string fileNameTemplate = Server.MapPath(Url.Content("~/assets/cert1-{0}-{1}.docx"));
string nnn = string.Format("cert1-{0}-{1}.pdf", trainee.StaffID, DateTime.Now.Millisecond);
string serverPath = MainConfig.P_EXPORT;
var folder = Server.MapPath(serverPath);
使用(文件 document_test = 新文件())
{
document_test.LoadFromFile(文件名模板);
//Update Text of Title
document_test.Replace("#trainee_name#", trainee.Name, false, true);
document_test.Replace("#course_name#", "Test", false, true);
document_test.Replace("#date_info#", DateTime.Today.ToShortDateString(), false, true);
document_test.SaveToFile(nnn, Spire.Doc.FileFormat.PDF, System.Web.HttpContext.Current.Response, HttpContentType.Attachment);
}
该代码在本地开发机器上运行完美,但是当我将它上传到 Azure Web 应用程序时,我收到一个一般性错误:GDI+ 中发生一般性错误。
堆栈跟踪:
[ExternalException (0x80004005): GDI+ 中发生一般错误。]
System.Drawing.Imaging.Metafile..ctor(Stream流, IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit, EmfType类型, String描述) +226801
System.Drawing.Imaging.Metafile..ctor(Stream 流, IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit, EmfType 类型) +34
sprᲦ.ᜀ(PageSetup A_0, ImageType A_1, MemoryStream A_2, Int32 A_3, GraphicsUnit A_4) +255
sprᲦ.ᜀ(PageSetup A_0, ImageType A_1, MemoryStream A_2, Int32 A_3) +19
sprᲦ.᜔() +224
sprᲦ.ᜁ(IDocument A_0) +234
spr᧤.ᜀ(文档 A_0) +93
Spire.Doc.Document.ᜀ(流A_0) +94
Spire.Doc.Document.SaveToFile(Stream 流, FileFormat 文件格式) +289
Spire.Doc.Document.SaveToFile(String fileName, FileFormat fileFormat, HttpResponse 响应, HttpContentType contentType) +673
LMSv1.Controllers.DisplayController.DownloadCertification(可为空1 tid, Nullable
1 eid) +616
lambda_method(闭包,ControllerBase,对象[])+146
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase控制器,Object[]参数)+14
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 parameters) +167
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2个参数) +27
System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +22
System.Web.Mvc.Async.WrappedAsyncResult2.CallEndDelegate(IAsyncResult asyncResult) +29
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End() +49
粗略猜测:您正在隐式引用另一个安装在 GAC 中或未设置为复制本地的 dll。因此,尽管大部分编译代码都部署到 Azure,但有问题的神秘 dll 并未部署到 azure。
另一个暗中猜测:也许可以查看 http://www.e-iceblue.com/Introduce/free-pdf-component.html 的文档,看看在 Azure 中 运行 时是否存在任何已知问题。
Azure Web Apps 运行 下的沙箱有一些限制,这些限制会阻止某些调用,这可能是您 运行 正在使用 GDI+ 的情况。
您可以在 https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#win32ksys-user32gdi32-restrictions.
上找到有关这些沙盒限制的更多信息
看来这个问题已经通过使用下面的代码解决了。查看类似的 post 和解决方案 here.
Document doc = new Document();
doc.LoadFromFile(fileName);
ToPdfParameterList tpl = new ToPdfParameterList{
UsePSCoversion = true;
//azure
};
doc.SaveToFile(resultName);
我正在使用 spire lib 为用户创建 pdf 文件。
string userId = User.Identity.GetUserId();
User trainee = _userDAL.GetUserByIdentityId(userId);
// Get the Employee scores
string fileNameTemplate = Server.MapPath(Url.Content("~/assets/cert1-{0}-{1}.docx"));
string nnn = string.Format("cert1-{0}-{1}.pdf", trainee.StaffID, DateTime.Now.Millisecond);
string serverPath = MainConfig.P_EXPORT;
var folder = Server.MapPath(serverPath);
使用(文件 document_test = 新文件()) { document_test.LoadFromFile(文件名模板);
//Update Text of Title
document_test.Replace("#trainee_name#", trainee.Name, false, true);
document_test.Replace("#course_name#", "Test", false, true);
document_test.Replace("#date_info#", DateTime.Today.ToShortDateString(), false, true);
document_test.SaveToFile(nnn, Spire.Doc.FileFormat.PDF, System.Web.HttpContext.Current.Response, HttpContentType.Attachment);
}
该代码在本地开发机器上运行完美,但是当我将它上传到 Azure Web 应用程序时,我收到一个一般性错误:GDI+ 中发生一般性错误。
堆栈跟踪:
[ExternalException (0x80004005): GDI+ 中发生一般错误。]
System.Drawing.Imaging.Metafile..ctor(Stream流, IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit, EmfType类型, String描述) +226801
System.Drawing.Imaging.Metafile..ctor(Stream 流, IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit, EmfType 类型) +34
sprᲦ.ᜀ(PageSetup A_0, ImageType A_1, MemoryStream A_2, Int32 A_3, GraphicsUnit A_4) +255
sprᲦ.ᜀ(PageSetup A_0, ImageType A_1, MemoryStream A_2, Int32 A_3) +19
sprᲦ.᜔() +224
sprᲦ.ᜁ(IDocument A_0) +234
spr᧤.ᜀ(文档 A_0) +93
Spire.Doc.Document.ᜀ(流A_0) +94
Spire.Doc.Document.SaveToFile(Stream 流, FileFormat 文件格式) +289
Spire.Doc.Document.SaveToFile(String fileName, FileFormat fileFormat, HttpResponse 响应, HttpContentType contentType) +673
LMSv1.Controllers.DisplayController.DownloadCertification(可为空1 tid, Nullable
1 eid) +616
lambda_method(闭包,ControllerBase,对象[])+146
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase控制器,Object[]参数)+14
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 parameters) +167
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2个参数) +27
System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +22
System.Web.Mvc.Async.WrappedAsyncResult2.CallEndDelegate(IAsyncResult asyncResult) +29
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End() +49
粗略猜测:您正在隐式引用另一个安装在 GAC 中或未设置为复制本地的 dll。因此,尽管大部分编译代码都部署到 Azure,但有问题的神秘 dll 并未部署到 azure。
另一个暗中猜测:也许可以查看 http://www.e-iceblue.com/Introduce/free-pdf-component.html 的文档,看看在 Azure 中 运行 时是否存在任何已知问题。
Azure Web Apps 运行 下的沙箱有一些限制,这些限制会阻止某些调用,这可能是您 运行 正在使用 GDI+ 的情况。
您可以在 https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#win32ksys-user32gdi32-restrictions.
上找到有关这些沙盒限制的更多信息看来这个问题已经通过使用下面的代码解决了。查看类似的 post 和解决方案 here.
Document doc = new Document();
doc.LoadFromFile(fileName);
ToPdfParameterList tpl = new ToPdfParameterList{
UsePSCoversion = true;
//azure
};
doc.SaveToFile(resultName);