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

2014年6月25日 星期三

我的網頁在 IE 11 下不能執行!?

今天發生的問題。

問題

我的網頁,在 IE11 下執行會發生錯誤,但 Chrome 卻是正常。所以 IE 好…

錯訊訊息

幸好,我們有留 exception log,並且當錯誤時直接會寄信到我們的信箱。

System.Data.SqlClient.SqlException: The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value.

怎麼會和 SQL 有關係呢?

再看程式碼

public Order GetFeedbackData(string taxNo, DateTime today)
{
    const string sql = @"Select * from Orders where orderDate = {0}";
    var query = _db.Database.SqlQuery<Order>(
        sql, today.ToShortDateString()).FirstOrDefault();
    return query;
}

原來,和 SQL 組字串有關。再看 ToShortDateString 的 msdn 說明,這個方法與Thread.CurrentCulture 有關。

答案呼之欲出了。

Web.Config

再看 Web.config, 有一段設定如下

<globalization culture="auto" uiCulture="auto"/>

查一下 http://msdn.microsoft.com/zh-tw/library/hy4kkhe0(v=vs.85).aspx,發現這個就是用來取得 Rquest 的 Thread.CurrentCulture 的根據。

使用 Fiddler 錄一下 Request, 發現 IE 11 的 Header Accept-Language: zh-Hant-TW,而 Chrome 的則為 zh-TW

答案揭曉。是 IE 10 之後,預設的 Accept-Language 改為 zh-Hant-TW

解決

解決方法很簡單,就是

  1. 不要組SQL 字串啦!
public Order GetFeedbackData(string taxNo, DateTime today)
{
    const string sql = @"Select * from Orders where orderDate = {0}";
    var query = _db.Database.SqlQuery<Order>(
        sql, today.ToShortDateString()).FirstOrDefault();
    return query;
}

直接使用 today 的 DateTime 型別傳入 Entity Framework 讓它為我們查詢即可。

參考

ASP.NET 2.0 多國語系網站與 Windows 8 的 IE10 語系設定

Visual Studio 2013 套件

整理一下我所使用的 Visual Studio 套件。

  1. SideWaffle : 增加好用的 snippet, project templates, item templates. 尤其在 angularjs 的開發上。
  2. OzCode : Debug 用
  3. jQuery Code Snippets
  4. Productivity Power Tools
  5. ReAttach : 重複 Attact 上一次所 attach 的 process。Debug 用
  6. SlowCheetah: xml Transforms, 轉換 .config 用,並且可以 preview 並比對轉換前後的差異
  7. Snippet Designer: http://snippetdesigner.codeplex.com/
  8. SpecFlow : BDD
  9. t4 editor: 寫 t4 template 用的編輯器
  10. Team Foundation Server Power Tool
  11. Web Essentials: 開發 Web 專案必備
  12. NUnit Test Adapter : 單元測試用
  13. xUnit Test Adapter : 單元測試用

2014年4月24日 星期四

如何讓 .NET 的網站 或 WebService 第一次啟動變快 ver 2014 ( IIS 啟動模式 )

 

自覺寫 blog 的功力大減,反而想把這裡變成自己的備忘錄,畢竟人入中年啊。
而好心的高手們,也都會熱心地留下心得,遠比我來的大方許多。

第一次啟動 ASP.NET 應用程式會比較慢的「傳統」已經過時了。
記得要更新大腦內的記憶體啊!

下面連結是 Franma Hsu 的好心提醒

如何讓 .NET 的網站 或 WebService 第一次啟動變快 ver 2014 ( IIS 啟動模式 )

2013年12月16日 星期一

不要用 jQuery Template

今天有看到公司的「合作夥伴」在使用 jQuery Template。
這是2010年微軟向 jQuery 提交的建議,但很快地就被否決了。

可在 這裡看到jQuery template 的歷史
微軟的 CDN 也一直停留在 beta 1好幾年了

所以,不要再用它了。

如果有相同的需求 ,請使用相對活著的

總之,不要用已經是過去式的東西。

2013年11月1日 星期五

「TFS 上取不到新版的程式」的解決方式

問題:

你好,有一個問題請你參詳一下,我在這邊的確是有看到一個現象,就是TFS的版本的確是最新的。但Local的版本是舊的,取得最新版還是舊的程式,請問這可能是甚麼原因?
如下圖

SNAGHTML39b195a

原因

取得新版本後,TFS Server 會記錄您已經取得對應的版本號(如 8172),但因故本機的檔案因異動而並不是最新的。
例如在檔案總管刪除檔案,此時 TFS 並不知道您手動刪除。

解決方式

強迫取得最新版本,即使本機已有最新版本也要以伺服器版本覆蓋本機檔案。
下圖以 VS2013 為例。在指定的目錄上,按右鍵,取得「指定的版本」

SNAGHTML39d1932

勾選選項「覆寫本機可寫但未簽出的檔案」,「即使與伺服器版本相同,也要覆蓋本機檔案」(<== 我自己翻的,正確的中文請自行比對)

SNAGHTML39db1a9

2013年10月18日 星期五

ASP.NET MVC 5 預設會設定 X-Frame-Options 為 SAMEORIGIN

如標題。

X-Frame-Options 是一個新的瀏覽器特色。請參考http://tools.ietf.org/html/draft-ietf-websec-x-frame-options-10

MVC 5 在 final 時,看來加上了這個預設選項。因此使用 F12 開發工具時,可以看到 MVC 5的網頁會多出 X-Frame-Options: 的 Header

image

VS2013 RC 時澴沒有這個事情呢。

而且,目前(2013-10-18) 網路上可參考的 ASP.NET MVC 5 文件並沒有說到這個事情。

偏偏,我就有這個需求,要讓我的網頁鑲在別人的網頁中。不得已,只好在 Global.axsx.cs 內加上這一段,解決這個困擾。

private void Application_EndRequest()
{
    Response.Headers.Remove("X-Frame-Options");
    Response.Headers["X-Frame-Options"] = "ALLOW-FROM http://aaa.test.domain/Main/";
}

其中,aaa.test.domain 就是我的另一個開發機器啦。

2014-02-06 Update:

後來找到更簡單的方法:

AntiForgeryConfig.SuppressXFrameOptionsHeader = true;

Share with Facebook