2014年12月12日 星期五

不要在 ASP.NET MVC 5 中,在 ActionFilterAttribute 上使用 Task.Factory.StartNew

今天在調整校能的時候,想到可以使用非同步的方式來增加網站的校能。

就拿 Log 來試試身手好了。

MVC 5 的ActionFilterAttribute 尚不支援非同步

真的是這樣,見 ActionFilterAttribute, 果然沒有像 WebAPI 上的 ActionFilterAttributeOnActionExecutedAsync 方法。

怎麼辦呢?

異相天開地找了一段如下的程式 (https://aspnetwebstack.codeplex.com/discussions/478983),既然被標為解答,大概就可以運作了吧!

Task.Factory.StartNew(() => Logger.WriteLogAsync(log),
				TaskCreationOptions.LongRunning);

想法是:自己使用多執行緒的方式寫 log.

結果還不錯,而且單頁測試時,效能還快了將近10%呢?

上線前效能測試

想說單頁沒問題,應該就沒問題了呢?於是就送出去測試來。

這個效能測試是正式的首頁,測個10分鐘,效能變差也就算了,竟然還會出現 502 Bad GetWays?然後網站就掛了。

結論

ASP.NET MVC 5 的ActionFilterAttribute 不支援 async/await,看來是有道理的。

印象中,ASP.NET 有這個規定:不要在頁面中自己產生新的執行緒。我不信邪,就只能撞撞牆,練練經驗了。

不要自己找麻煩。

2014年12月9日 星期二

發行程式到 Azure Web Site 失敗

一直以來,對 Azure Web Site 深懷無比的信心,因為它部署程式非常的快,無比的方便。因此,只要能力所及,就會推銷此方法來實作網站。

沒想到,上個星期部署網站失敗了。錯誤畫面如下。

image

試了幾下,將網站重起後,就可以繼續部署了。真是奇怪!

image

今天,同事又回報相同的狀況發生,而且,上面的招數沒用了。

於是,更進階的招數來囉!將網站刪除,然後重建,心想我都重建了,應該會有效果吧!

天不從人願!就跟薪水一樣不聽使喚。

找微軟吧!沒有技術支援點數,不鳥我!給了我 forum 自行發問吧。

解決方法

微軟的論譠真的是有用的。於是找到了這一篇

http://azure.microsoft.com/blog/2014/06/30/web-deploy-as-a-site-extension/

原來,網站有新的部署方法,使用了 {yourwebsite}.scm.azurewebsites.net 來部署。就使用舊的部署端點來發行程式吧!

在Azure Portal 上,將該網站加上一個設定 WEBSITE_WEBDEPLOY_USE_SCM = false 後,記得按儲存

image

接下來下載發行設定檔,再使用這個發行設定檔,在Visual Studio  中發行!

萬歲!

(??) 我發現只有這個訂閱所建立的網站會這樣,即使建立新的網站也無法發行。但其他的訂閱就可以?到目前仍不明所以。

2014年11月18日 星期二

如何刪除已離職同事所遷出的檔案

公司同事離職了,TFS上仍然是簽出的。如果是文字檔的話那還好,因為可以同時簽出,不會因為該檔案被簽出而被鎖住無法簽入。但 *.rdlc 就是一個例子。明明是文字檔,但tfs 不知道,只能以 binary 檔案來處理。

以下是我找出來的指令, tfs server url 自行置換

查詢所有的 workspaces
tf workspaces /collection:http://tfsserver:8080/tfs/defaultcollection /owner:*


刪除指定的 workspace
tf workspace /delete workspaceName;account /server:http://tfsserver:8080/tfs/defaultcollection

2014年10月16日 星期四

NuGet 3.0 將不再支援 VS2010

VS2010 仍然可以使用舊版的 NetGet 2.X,但有使用到新版特色的 package,就無法透過 NuGet 2.x 來取得了。

   目前 VS2010 的使用率只剩 6%。也請各位有空升級一下。

參考:

    http://blog.nuget.org/20141002/visual-studio-2010.html

2014年10月1日 星期三

微軟更新 IE 的技術支援生命期期

微軟的 IE 一直被人罵,所以微軟除了更新 IE 版本外,也發現客戶不更新版本,卻一直罵 IE 不好用。

眼看著 Chrome, Firefox等市佔率一直成長,但 IE 身為作業系統的一部份,不能說更新就更新。不像 Chrome, Firefox 是強迫更新,且無法降版本。


因此,微軟更新 IE 的技術支援生命期期。

原則: 2016/1/12 之後,Windows 只支援該 Windows 版本的可用 IE 的最新版本。

例如:Windows Vista 可支援的 IE 版本為 7, 8, 9。到2016/1/12 起,只支援 IE 9。雖然仍然可以執行 IE 7,8,但微軟不再支援!  有問題,請升級 IE 9。

相關的 Windows  版本及 IE 版本,請見 http://support2.microsoft.com/gp/microsoft-internet-explorer

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 啟動模式 )

Share with Facebook