2014年9月4日 星期四

Azure WebSite 上使用 MS Report 產生 PDF, 發生 ArgumentException: Parameter is not valid 的例外

問題

在使用 Azure WebSite (免費模式),並且使用 Microsoft.ReportViewer.WebForms 產生 PDF 檔時,發生了下面的錯誤

[ArgumentException: Parameter is not valid.]
   System.Drawing.Graphics.GetHdc() +1153145
   Microsoft.ReportingServices.Rendering.RichText.LineBreaker.Flow(TextBox textBox, Graphics g, FontCache fontCache, FlowContext flowContext, Boolean keepLines, Single& height) +75

原因

原來,MS Report 在產生 PDF 檔時,會使用到 GDI+ 的assembly。而 Azure WebSite 對於 GDI+ assembly 的使用有權限上的限制。(就是不能使用啦!)

找到一篇 WINDOWS AZURE WEB SITES VS WEB ROLES,裡頭就寫到了 Azure Web Site 無法使用 GDI+, 而 Cloud Service (Web Role 或 Worker Role) 則沒有這個限制!

因為 Azure Web Site 免費模式與共享模式的關係,Web Site 所執行的帳號是 random account,也沒有辦法存取系統的資源,包括 GDI+ (圖形)。

http://stackoverflow.com/questions/16183529/reportviewer-rdlc-azure-websites-error-80004005 中,WAWS team 的人更直接回答

PDF generation is actually not supported in the security configuration on WAWS, in this case you should use either a WebRole or a Web Server on a Virtual Machine. Thanks! Nir (WAWS team)

解決

因為與別人分享而無法獨佔圖形,那如果整台虛擬機都是我所有,會不會解決這個問題呢?馬上將模式調整成「基本」模式看看。

image

果然,重新再執行相同的功能就解決了。(可是,這樣比較花錢)

 

參考

WINDOWS AZURE WEB SITES VS WEB ROLES

http://social.msdn.microsoft.com/forums/azure/en-US/b4a6eb43-0013-435f-9d11-00ee26a8d017/report-viewer-error-on-export-pdf-or-excel-from-azure-web-sites

Share with Facebook