tag:blogger.com,1999:blog-27995399758758551232024-03-06T12:15:11.149+08:00程湘之間我的工作主要是開發專案,分析及設計軟體,以asp.net 為主要實作平台。
在公司內,除了專案的開發外,也負責軟體技術的研發及教育訓練。因此,也常常對內開技術課程,及技術支援。Unknownnoreply@blogger.comBlogger624125tag:blogger.com,1999:blog-2799539975875855123.post-87987928864522987562015-09-08T09:56:00.001+08:002015-09-08T09:56:37.512+08:00Visual Studio 2015 發佈 Web App 發生的問題<h2>問題</h2> <p>今天更新 Web App 程式時,發生了下面的錯誤:</p> <p><a href="http://lh3.googleusercontent.com/-6ieUkhIH6nU/Ve5ATsou2KI/AAAAAAAAwhk/3lV2xUm9VfI/s1600-h/image%25255B3%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh3.googleusercontent.com/-tvnhSZp-VMM/Ve5AU9sI35I/AAAAAAAAwhs/-oqFUPvTZ58/image_thumb%25255B1%25255D.png?imgmax=800" width="695" height="50"></a></p> <p>An error occurred while creating the WebJob schedule: Could not load type 'Microsoft.IdentityModel.Clients.ActiveDirectory.ActiveDirectoryAuthenticationException' from assembly 'Microsoft.IdentityModel.Clients.ActiveDirectory, Version=2.16.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.</p> <p>什麼鬼東西。我明明參考的是 2.19 版啊?於是又將這個assembly 加入這個 WebJob,然後還是不行。</p> <h2>原因</h2> <p>原來,只是在 VS2015 上的 Cloud Explorer 的帳密過期了,需要重敲。<br>這個錯誤訊息也太…</p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-78388229185483872332015-02-06T09:20:00.001+08:002015-02-06T09:34:53.193+08:00物件導向不應該犯的錯,竟導致 ASP.NET Identity lockout 機制失敗<p>會犯這種錯,當然是錯誤的示範啦。</p> <h1>歷史</h1> <p>首先,我們使用了 TDD 的開發方式,所以先寫測試,再寫商業邏輯。此時,還沒有網頁的需求。<br>然後,再加上網頁後,遵循 Agile 的精神,對使用者重要的先寫,所以仍以商業需求為主。此時用的是 EF Code First + MemberShip Provider 做登入驗證。</p> <p>當然,使用者對他要求的商業需求已經滿意了。最後使用者常見的非功能需求,「要求登入失敗多次後,鎖定帳號 5分鐘」這種安全性的需求時,我們早就準備好了 ASP.NET identity (傳著等)。</p> <p>等等!竟然鎖定機制失效了!故意打入正確帳號但錯誤的密碼,只見 AccessFailedCount 完全不聽使喚,全然不會遞增。</p> <h1>原因</h1> <p>因為我們之前已經有自訂的 ApplicationUser 類別,而類別中已有 Email 屬性。而最後為了使用 ASP.NET Identity,自然地會將我們自訂的 ApplicationUser 類別繼承 IdentityUser. </p> <p>此時,ApplicationUser 如下圖</p> <p><a href="http://lh3.ggpht.com/-nt3tTvKQRmk/VNQW6a796OI/AAAAAAAAGI8/vcFYJv4WNP4/s1600-h/image%25255B3%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-uinN94aqKJ8/VNQW62oB-aI/AAAAAAAAGJA/VtHiHuGiwWk/image_thumb%25255B1%25255D.png?imgmax=800" width="316" height="202"></a></p> <p>看起來沒什麼狀況吧。咦?Email 屬性下有一點小波浪?反正是 Warning,應該不會有什麼問題。<br>就這個念題,讓我浪費了半天的好光陰. </p> <p>仔細看一下提示訊息,the keyword ‘new’ is required on ‘Email’ because ….,這個意指著在 c# 中,如同上面的程式碼,代表著「身為 ApplicationUser 的 Email 與身為 IdentityUser 的Email 是不相同屬性」, 見下面的單元測試。這是dotnet framework 較為特殊的地方。而這個地方將導致 ASP.NET Identity Lockout 機制失敗。 </p> <p><a href="http://lh3.ggpht.com/-bj2ZDc_QMDo/VNQW7pIURYI/AAAAAAAAGJM/g3Trs2x0S7g/s1600-h/image%25255B7%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-YrKeth9a3NM/VNQW8P5-vmI/AAAAAAAAGJU/x-sqYY8Ho7s/image_thumb%25255B3%25255D.png?imgmax=800" width="325" height="171"></a></p> <h1>解法</h1> <p>只需要簡單地在ApplicationUser 將重複的 Email 屬性移除, 或者加上 override 指示詞就解決了這個看來完全不相干的問題。</p> <h1>結論</h1> <p>要發生我遇到的狀況,其實很簡單。建立一個MVC新專案,找到 ApplicationUser,再加上那個沒有 override 的 Email 屬性,就可以還原我碰到的問題了。</p> <p>這代表著:連 warning 都不可以忽略!</p> Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-2799539975875855123.post-51296166678605861802015-01-27T14:32:00.001+08:002015-01-27T14:32:13.990+08:00FaceBook 網掛了。紀念一下吧!<p>很少看到 fb 掛點的。</p> <p><a href="http://lh3.ggpht.com/-wKpHtkaBWs8/VMcw6m9RrZI/AAAAAAAAGIk/9TOYyVBeUQw/s1600-h/image%25255B3%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-wsJAPAbH_98/VMcw7I_hXzI/AAAAAAAAGIs/xn9fjn4FOL8/image_thumb%25255B1%25255D.png?imgmax=800" width="502" height="294"></a></p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-28913184361344116152015-01-15T10:12:00.001+08:002015-01-15T10:12:33.513+08:00建議關閉 SSL 3.0<p>現在因為 SSL 3.0 的弱點關係,Azure 上的PaaS 將全面停用 SSL 3.0 (見 <p><a href="http://view.email.microsoftemail.com/?j=fe8e177270640d7573&m=fe621570756503797d1c&ls=fe121778736d0d787d1c75&l=fec21c767365017e&s=fe2912707d6d067c771274&jb=ffce15&ju=">http://view.email.microsoftemail.com/?j=fe8e177270640d7573&m=fe621570756503797d1c&ls=fe121778736d0d787d1c75&l=fec21c767365017e&s=fe2912707d6d067c771274&jb=ffce15&ju=</a> ) <p>但是自建的 Virtual Machine,不管是自己機房的還是 Azure,都需要自行管理。 <p>因此,建議大家也需要關閉 SSL 3.0 <p>執行的做法如下連結 <p><a href="https://technet.microsoft.com/en-us/library/security/3009008.aspx">https://technet.microsoft.com/en-us/library/security/3009008.aspx</a> <p><a href="https://disablessl3.com">https://disablessl3.com</a>/ </p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-71030221034832329922014-12-12T17:09:00.001+08:002014-12-12T17:12:16.715+08:00不要在 ASP.NET MVC 5 中,在 ActionFilterAttribute 上使用 Task.Factory.StartNew<p>今天在調整校能的時候,想到可以使用非同步的方式來增加網站的校能。</p> <p>就拿 Log 來試試身手好了。</p> <h1>MVC 5 的ActionFilterAttribute 尚不支援非同步</h1> <p>真的是這樣,見 <a href="http://msdn.microsoft.com/zh-tw/library/system.web.mvc.actionfilterattribute%28v=vs.118%29.aspx">ActionFilterAttribute</a>, 果然沒有像 WebAPI 上的 <a href="http://msdn.microsoft.com/zh-tw/library/system.web.http.filters.actionfilterattribute(v=vs.118).aspx">ActionFilterAttribute</a> 的<a href="http://msdn.microsoft.com/zh-tw/library/system.web.http.filters.actionfilterattribute.onactionexecutedasync(v=vs.118).aspx">OnActionExecutedAsync</a> 方法。</p> <p>怎麼辦呢?</p> <p>異相天開地找了一段如下的程式 (<a title="https://aspnetwebstack.codeplex.com/discussions/478983" href="https://aspnetwebstack.codeplex.com/discussions/478983">https://aspnetwebstack.codeplex.com/discussions/478983</a>),既然被標為解答,大概就可以運作了吧!</p> <pre>Task.Factory.StartNew(() => Logger.WriteLogAsync(log),
TaskCreationOptions.LongRunning);</pre>
<p>想法是:自己使用多執行緒的方式寫 log. </p>
<p>結果還不錯,而且單頁測試時,效能還快了將近10%呢?</p>
<h1>上線前效能測試</h1>
<p>想說單頁沒問題,應該就沒問題了呢?於是就送出去測試來。</p>
<p>這個效能測試是正式的首頁,測個10分鐘,效能變差也就算了,竟然還會出現 502 Bad GetWays?然後網站就掛了。</p>
<h1>結論</h1>
<p>ASP.NET MVC 5 的ActionFilterAttribute 不支援 async/await,看來是有道理的。</p>
<p>印象中,ASP.NET 有這個規定:不要在頁面中自己產生新的執行緒。我不信邪,就只能撞撞牆,練練經驗了。</p>
<p>不要自己找麻煩。</p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-6828873264723497402014-12-09T16:45:00.001+08:002014-12-09T16:45:25.302+08:00發行程式到 Azure Web Site 失敗<p>一直以來,對 Azure Web Site 深懷無比的信心,因為它部署程式非常的快,無比的方便。因此,只要能力所及,就會推銷此方法來實作網站。</p> <p>沒想到,上個星期部署網站失敗了。錯誤畫面如下。</p> <p><a href="http://lh4.ggpht.com/-q3Tn2O-Tty8/VIa2lva3hQI/AAAAAAAAGHo/QIDb-yWMX-Y/s1600-h/image%25255B3%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-Su6bCoohQwg/VIa2mU-dGAI/AAAAAAAAGHw/SMTdtZOM4tw/image_thumb%25255B1%25255D.png?imgmax=800" width="367" height="193"></a></p> <p>試了幾下,將網站重起後,就可以繼續部署了。真是奇怪!</p> <p><a href="http://lh5.ggpht.com/-QCYUqqVhL9A/VIa2nA9SyCI/AAAAAAAAGH4/b7cLcJRCrQk/s1600-h/image%25255B7%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-YY3iBjKMZdw/VIa2nxVfnEI/AAAAAAAAGIA/zKBvFq-ru40/image_thumb%25255B3%25255D.png?imgmax=800" width="332" height="52"></a></p> <p>今天,同事又回報相同的狀況發生,而且,上面的招數沒用了。</p> <p>於是,更進階的招數來囉!將網站刪除,然後重建,心想我都重建了,應該會有效果吧!</p> <p>天不從人願!就跟薪水一樣不聽使喚。</p> <p>找微軟吧!沒有技術支援點數,不鳥我!給了我 forum 自行發問吧。</p> <h1>解決方法</h1> <p>微軟的論譠真的是有用的。於是找到了這一篇</p> <p><a title="http://azure.microsoft.com/blog/2014/06/30/web-deploy-as-a-site-extension/" href="http://azure.microsoft.com/blog/2014/06/30/web-deploy-as-a-site-extension/">http://azure.microsoft.com/blog/2014/06/30/web-deploy-as-a-site-extension/</a></p> <p>原來,網站有新的部署方法,使用了 {yourwebsite}.scm.azurewebsites.net 來部署。就使用舊的部署端點來發行程式吧!</p> <p>在Azure Portal 上,將該網站加上一個設定 <strong>WEBSITE_WEBDEPLOY_USE_SCM = false </strong>後,記得按儲存</p> <p><a href="http://lh3.ggpht.com/-Zh9lglh4ypo/VIa2oURj1UI/AAAAAAAAGII/wYii5z37lBY/s1600-h/image%25255B11%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-uoEmlO0zoV8/VIa2pGDRywI/AAAAAAAAGIM/NTtez44H-g8/image_thumb%25255B5%25255D.png?imgmax=800" width="469" height="99"></a></p> <p>接下來下載發行設定檔,再使用這個發行設定檔,在Visual Studio 中發行!</p> <p>萬歲!</p> <p>(??) 我發現只有這個訂閱所建立的網站會這樣,即使建立新的網站也無法發行。但其他的訂閱就可以?到目前仍不明所以。</p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-2087214121178336522014-11-18T16:53:00.001+08:002014-11-18T16:53:18.554+08:00如何刪除已離職同事所遷出的檔案<p>公司同事離職了,TFS上仍然是簽出的。如果是文字檔的話那還好,因為可以同時簽出,不會因為該檔案被簽出而被鎖住無法簽入。但 *.rdlc 就是一個例子。明明是文字檔,但tfs 不知道,只能以 binary 檔案來處理。</p> <p>以下是我找出來的指令, tfs server url 自行置換</p> <p>查詢所有的 workspaces<br>tf workspaces /collection:<a href="http://tfsserver:8080/tfs/defaultcollection">http://tfsserver:8080/tfs/defaultcollection</a> /owner:*</p> <p><br>刪除指定的 workspace<br>tf workspace /delete workspaceName;account /server:http://tfsserver:8080/tfs/defaultcollection </p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-53532797301519945152014-10-16T08:58:00.001+08:002014-10-16T09:19:28.845+08:00NuGet 3.0 將不再支援 VS2010<p>VS2010 仍然可以使用舊版的 NetGet 2.X,但有使用到新版特色的 package,就無法透過 NuGet 2.x 來取得了。</p> <p> 目前 VS2010 的使用率只剩 6%。也請各位有空升級一下。</p> <p>參考:</p> <p> <a href="http://blog.nuget.org/20141002/visual-studio-2010.html">http://blog.nuget.org/20141002/visual-studio-2010.html</a></p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-87330637014026101752014-10-01T08:50:00.001+08:002014-10-01T08:50:44.760+08:00微軟更新 IE 的技術支援生命期期<p>微軟的 IE 一直被人罵,所以微軟除了更新 IE 版本外,也發現客戶不更新版本,卻一直罵 IE 不好用。</p> <p>眼看著 Chrome, Firefox等市佔率一直成長,但 IE 身為作業系統的一部份,不能說更新就更新。不像 Chrome, Firefox 是強迫更新,且無法降版本。</p> <p><br>因此,微軟更新 IE 的技術支援生命期期。</p> <p>原則: 2016/1/12 之後,Windows 只支援該 Windows 版本的可用 IE 的最新版本。</p> <p>例如:Windows Vista 可支援的 IE 版本為 7, 8, 9。到2016/1/12 起,只支援 IE 9。雖然仍然可以執行 IE 7,8,但微軟不再支援! 有問題,請升級 IE 9。</p> <p>相關的 Windows 版本及 IE 版本,請見 <a href="http://support2.microsoft.com/gp/microsoft-internet-explorer">http://support2.microsoft.com/gp/microsoft-internet-explorer</a></p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-62621908180282181452014-09-04T11:24:00.001+08:002014-09-04T11:28:17.676+08:00Azure WebSite 上使用 MS Report 產生 PDF, 發生 ArgumentException: Parameter is not valid 的例外<h2>問題</h2> <p>在使用 Azure WebSite (免費模式),並且使用 Microsoft.ReportViewer.WebForms 產生 PDF 檔時,發生了下面的錯誤</p> <p>[ArgumentException: Parameter is not valid.]<br> System.Drawing.Graphics.GetHdc() +1153145<br> Microsoft.ReportingServices.Rendering.RichText.LineBreaker.Flow(TextBox textBox, Graphics g, FontCache fontCache, FlowContext flowContext, Boolean keepLines, Single& height) +75 <h2>原因</h2> <p>原來,MS Report 在產生 PDF 檔時,會使用到 GDI+ 的assembly。而 Azure WebSite 對於 GDI+ assembly 的使用有權限上的限制。(就是不能使用啦!)</p> <p>找到一篇 <a href="http://robdmoore.id.au/blog/2012/06/09/windows-azure-web-sites-vs-web-roles/">WINDOWS AZURE WEB SITES VS WEB ROLES</a>,裡頭就寫到了 Azure Web Site 無法使用 GDI+, 而 Cloud Service (Web Role 或 Worker Role) 則沒有這個限制!</p> <p>因為 Azure Web Site 免費模式與共享模式的關係,Web Site 所執行的帳號是 random account,也沒有辦法存取系統的資源,包括 GDI+ (圖形)。</p> <p><a title="http://stackoverflow.com/questions/16183529/reportviewer-rdlc-azure-websites-error-80004005" href="http://stackoverflow.com/questions/16183529/reportviewer-rdlc-azure-websites-error-80004005">http://stackoverflow.com/questions/16183529/reportviewer-rdlc-azure-websites-error-80004005</a> 中,WAWS team 的人更直接回答</p> <p>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)</p> <h2>解決</h2> <p>因為與別人分享而無法獨佔圖形,那如果整台虛擬機都是我所有,會不會解決這個問題呢?馬上將模式調整成「基本」模式看看。</p> <p><a href="http://lh4.ggpht.com/-fHwahxihiYs/VAfbT5bRedI/AAAAAAAAGF4/3Z5C7zrP5yI/s1600-h/image%25255B2%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-mUUE8x0YPwI/VAfbUiTXmQI/AAAAAAAAGGA/JYUjjEHvaLc/image_thumb.png?imgmax=800" width="244" height="56"></a></p> <p>果然,重新再執行相同的功能就解決了。(可是,這樣比較花錢)</p> <p> </p> <h2>參考</h2> <p><a href="http://robdmoore.id.au/blog/2012/06/09/windows-azure-web-sites-vs-web-roles/">WINDOWS AZURE WEB SITES VS WEB ROLES</a></p> <p><a title="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" href="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">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</a></p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-32816909552040283942014-06-25T16:53:00.001+08:002014-06-25T16:53:46.945+08:00我的網頁在 IE 11 下不能執行!?<p>今天發生的問題。</p> <h2>問題</h2> <p>我的網頁,在 IE11 下執行會發生錯誤,但 Chrome 卻是正常。所以 IE 好…</p> <h2>錯訊訊息</h2> <p>幸好,我們有留 exception log,並且當錯誤時直接會寄信到我們的信箱。</p> <p><i>System.Data.SqlClient.SqlException: The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value.</i> <p>怎麼會和 SQL 有關係呢? <p>再看程式碼<pre class="csharpcode"><span class="kwrd">public</span> Order GetFeedbackData(<span class="kwrd">string</span> taxNo, DateTime today)
{
<span class="kwrd">const</span> <span class="kwrd">string</span> sql = <span class="str">@"Select * from Orders where orderDate = {0}"</span>;
var query = _db.Database.SqlQuery<Order>(
sql, today.ToShortDateString()).FirstOrDefault();
<span class="kwrd">return</span> query;
}</pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>原來,和 SQL 組字串有關。再看 <a href="http://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=zh-tw&k=k(System.DateTime.ToShortDateString);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5.1);k(DevLang-csharp)&rd=true">ToShortDateString</a> 的 msdn 說明,這個方法與<a href="http://msdn.microsoft.com/zh-tw/library/system.threading.thread.currentculture(v=vs.110).aspx">Thread.CurrentCulture</a> 有關。</p>
<p>答案呼之欲出了。</p>
<h2>Web.Config</h2>
<p>再看 Web.config, 有一段設定如下</p><pre class="csharpcode"><globalization culture=<span class="str">"auto"</span> uiCulture=<span class="str">"auto"</span>/></pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>查一下 <a title="http://msdn.microsoft.com/zh-tw/library/hy4kkhe0(v=vs.85).aspx" href="http://msdn.microsoft.com/zh-tw/library/hy4kkhe0(v=vs.85).aspx">http://msdn.microsoft.com/zh-tw/library/hy4kkhe0(v=vs.85).aspx</a>,發現這個就是用來取得 Rquest 的 Thread.CurrentCulture 的根據。</p>
<p>使用 Fiddler 錄一下 Request, 發現 IE 11 的 Header Accept-Language: zh-Hant-TW,而 Chrome 的則為 zh-TW</p>
<p>答案揭曉。是 IE 10 之後,預設的 Accept-Language 改為 zh-Hant-TW</p>
<h2>解決</h2>
<p>解決方法很簡單,就是</p>
<ol>
<li>不要組SQL 字串啦!</li></ol><pre class="csharpcode"><span class="kwrd">public</span> Order GetFeedbackData(<span class="kwrd">string</span> taxNo, DateTime today)
{
<span class="kwrd">const</span> <span class="kwrd">string</span> sql = <span class="str">@"Select * from Orders where orderDate = {0}"</span>;
var query = _db.Database.SqlQuery<Order>(
sql, today.<strike>ToShortDateString()</strike>).FirstOrDefault();
<span class="kwrd">return</span> query;
}</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>直接使用 today 的 DateTime 型別傳入 Entity Framework 讓它為我們查詢即可。</p>
<h2>參考</h2>
<p><a href="http://blog.miniasp.com/post/2012/03/11/ASPNET-20-e5a49ae59c8be8aa9ee7b3bbe7b6b2e7ab99e88887-Windows-8-e79a84-IE10-e8aa9ee7b3bbe8a8ade5ae9a.aspx">ASP.NET 2.0 多國語系網站與 Windows 8 的 IE10 語系設定</a></p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-56123482531483126252014-06-25T07:47:00.001+08:002014-06-25T07:47:25.603+08:00Visual Studio 2013 套件<p>整理一下我所使用的 Visual Studio 套件。</p> <ol> <li><a href="http://sidewaffle.com/">SideWaffle</a> : 增加好用的 snippet, project templates, item templates. 尤其在 angularjs 的開發上。</li> <li><a href="http://o.oz-code.com/">OzCode</a> : Debug 用</li> <li><a href="https://github.com/kspearrin/Visual-Studio-jQuery-Code-Snippets">jQuery Code Snippets</a></li> <li>Productivity Power Tools</li> <li>ReAttach : 重複 Attact 上一次所 attach 的 process。Debug 用</li> <li>SlowCheetah: xml Transforms, 轉換 .config 用,並且可以 preview 並比對轉換前後的差異</li> <li>Snippet Designer: <a title="http://snippetdesigner.codeplex.com/" href="http://snippetdesigner.codeplex.com/">http://snippetdesigner.codeplex.com/</a></li> <li><a title="http://www.specflow.org/" href="http://www.specflow.org/">SpecFlow</a> : BDD </li> <li><a href="http://t4-editor.tangible-engineering.com/">t4 editor</a>: 寫 t4 template 用的編輯器</li> <li>Team Foundation Server Power Tool</li> <li>Web Essentials: 開發 Web 專案必備</li> <li><a href="http://nunit.org/index.php?p=vsTestAdapter&r=2.6.2">NUnit Test Adapter</a> : 單元測試用</li> <li><a href="https://github.com/xunit/xunit">xUnit Test Adapter</a> : 單元測試用 </li></ol> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-8961048713439834192014-04-24T07:22:00.001+08:002014-04-24T07:22:29.310+08:00如何讓 .NET 的網站 或 WebService 第一次啟動變快 ver 2014 ( IIS 啟動模式 )<p> </p> <p>自覺寫 blog 的功力大減,反而想把這裡變成自己的備忘錄,畢竟人入中年啊。<br>而好心的高手們,也都會熱心地留下心得,遠比我來的大方許多。</p> <p>第一次啟動 ASP.NET 應用程式會比較慢的「傳統」已經過時了。<br>記得要更新大腦內的記憶體啊! <p>下面連結是 <a href="https://www.facebook.com/franma.hsu?fref=nf">Franma Hsu</a> 的好心提醒 <p><a title="http://www.dotblogs.com.tw/franma/archive/2014/04/23/144845.aspx" href="http://www.dotblogs.com.tw/franma/archive/2014/04/23/144845.aspx">如何讓 .NET 的網站 或 WebService 第一次啟動變快 ver 2014 ( IIS 啟動模式 )</a></p> Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2799539975875855123.post-89777893579367321982013-12-16T15:46:00.001+08:002013-12-16T15:47:11.904+08:00不要用 jQuery Template<p>今天有看到公司的「合作夥伴」在使用 jQuery Template。<br> 這是2010年微軟向 jQuery 提交的<a href="https://github.com/nje/jquery/wiki/jquery-templates-proposal">建議</a>,但很快地就被否決了。 <p>可在 這裡看到jQuery template 的<a href="http://www.borismoore.com/2011/10/jquery-templates-and-jsviews-roadmap.html">歷史</a>。<br>微軟的 CDN 也一直停留在 <a href="http://www.asp.net/ajaxlibrary/cdn.ashx#jQuery_Templates_Releases_on_the_CDN_5">beta 1</a>好幾年了 <p>所以,不要再用它了。 <p>如果有相同的需求 ,請使用相對活著的 <ul> <li><a href="https://github.com/BorisMoore/jsrender">JsRender</a></li> <li><a href="https://github.com/BorisMoore/jsviews">JsView</a></li> <li><a href="http://knockoutjs.com/">KnockOutjs</a></li> <li><a href="http://www.kendoui.com/">KendoUI</a></li> <li><a href="http://angularjs.org/">AngularJs</a></li></ul> <p>總之,<font size="4">不要用已經是過去式的東西。</font></p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-72306344410972769742013-11-01T08:24:00.001+08:002013-11-01T08:24:52.354+08:00「TFS 上取不到新版的程式」的解決方式<h2><b>問題:</b></h2> <p>你好,有一個問題請你參詳一下,我在這邊的確是有看到一個現象,就是TFS的版本的確是最新的。但Local的版本是舊的,取得最新版還是舊的程式,請問這可能是甚麼原因?<br>如下圖 <p><a href="http://lh3.ggpht.com/-GEieOGZvvC8/UnL0wHBc_HI/AAAAAAAABy4/-cwBtbn2ny8/s1600-h/SNAGHTML39b195a%25255B4%25255D.png"><img title="SNAGHTML39b195a" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="SNAGHTML39b195a" src="http://lh5.ggpht.com/-VFHg_FRLsJs/UnL0xHjamEI/AAAAAAAABzA/eXMcyIQ-an8/SNAGHTML39b195a_thumb%25255B1%25255D.png?imgmax=800" width="346" height="128"></a> <h2>原因</h2> <p>取得新版本後,TFS Server 會記錄您已經取得對應的版本號(如 8172),但因故本機的檔案因異動而並不是最新的。<br>例如在檔案總管刪除檔案,此時 TFS 並不知道您手動刪除。 <p><b>解決方式</b> <p><b></b> <p><b></b>強迫取得最新版本,即使本機已有最新版本也要以伺服器版本覆蓋本機檔案。<br>下圖以 VS2013 為例。在指定的目錄上,按右鍵,取得「指定的版本」 <p><a href="http://lh6.ggpht.com/-AUDHvdL2dyY/UnL0yLGjeEI/AAAAAAAABzE/_k3vofNkEtk/s1600-h/SNAGHTML39d1932%25255B3%25255D.png"><img title="SNAGHTML39d1932" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="SNAGHTML39d1932" src="http://lh6.ggpht.com/-XyelN4_gANY/UnL0zFL79bI/AAAAAAAABzQ/zCmUPRBVnZ4/SNAGHTML39d1932_thumb.png?imgmax=800" width="244" height="166"></a> <p>勾選選項「覆寫本機可寫但未簽出的檔案」,「即使與伺服器版本相同,也要覆蓋本機檔案」(<== 我自己翻的,正確的中文請自行比對) <p><a href="http://lh5.ggpht.com/-DjmLycMYPmU/UnL0z0PfgEI/AAAAAAAABzY/9TA5_T0FZ30/s1600-h/SNAGHTML39db1a9%25255B3%25255D.png"><img title="SNAGHTML39db1a9" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="SNAGHTML39db1a9" src="http://lh6.ggpht.com/-VkPy_yA6IYQ/UnL00ocVy5I/AAAAAAAABzg/IZ1NO_5AQdM/SNAGHTML39db1a9_thumb.png?imgmax=800" width="244" height="196"></a> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-78433430256894393282013-10-18T16:34:00.001+08:002014-02-06T11:52:02.649+08:00ASP.NET MVC 5 預設會設定 X-Frame-Options 為 SAMEORIGIN<p>如標題。</p> <p>X-Frame-Options 是一個新的瀏覽器特色。請參考<a title="http://tools.ietf.org/html/draft-ietf-websec-x-frame-options-10" href="http://tools.ietf.org/html/draft-ietf-websec-x-frame-options-10">http://tools.ietf.org/html/draft-ietf-websec-x-frame-options-10</a></p> <p>MVC 5 在 final 時,看來加上了這個預設選項。因此使用 F12 開發工具時,可以看到 MVC 5的網頁會多出 X-Frame-Options: 的 Header</p> <p><a href="http://lh3.ggpht.com/-kQQFbEDuuvY/UmDyk317hsI/AAAAAAAABxU/wsJ5O92hjaw/s1600-h/image2.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-Z7jK7nn090Y/UmDylrPUb8I/AAAAAAAABxc/tid37MkZJ1Y/image_thumb.png?imgmax=800" width="244" height="128"></a></p> <p>VS2013 RC 時澴沒有這個事情呢。</p> <p>而且,目前(2013-10-18) 網路上可參考的 ASP.NET MVC 5 文件並沒有說到這個事情。</p> <p>偏偏,我就有這個需求,要讓我的網頁鑲在別人的網頁中。不得已,只好在 Global.axsx.cs 內加上這一段,解決這個困擾。</p><pre class="csharpcode"><span class="kwrd">private</span> <span class="kwrd">void</span> Application_EndRequest()
{
Response.Headers.Remove(<span class="str">"X-Frame-Options"</span>);
Response.Headers[<span class="str">"X-Frame-Options"</span>] = <span class="str">"ALLOW-FROM http://aaa.test.domain/Main/"</span>;
}</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>其中,aaa.test.domain 就是我的另一個開發機器啦。
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>2014-02-06 Update:</p>
<p>後來找到更簡單的方法:</p><pre class="csharpcode">AntiForgeryConfig.SuppressXFrameOptionsHeader = <span class="kwrd">true</span>;</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style> Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2799539975875855123.post-12514987681063107442013-09-04T10:29:00.001+08:002013-09-04T10:29:02.517+08:00AnyCPU, x86, x64, ARM<p>今天終於稍微了解了 AnyCPU的用意了。特地記錄下來,避免記憶體 reset 的老問題。</p> <h2>Visual Studio.NET 2003</h2> <p>在這個年代之前,並沒有64位元的 CPU(應該說不普及)。此時 Visual Studio 並不提供 CPU 相關的選項。回想一下,這是多麼美好的事。</p> <h2>Visual Studio 2005,2008</h2> <p>也才再過個兩年,64 位元的 CPU 開始在伺服器上普遍了起來。到了2007年前後,連桌上電腦也愈來愈普及。為了面對問題,微軟 Visual Studio 2005 開始有了 AnyCPU 的平台目標選項。</p> <p><a href="http://lh4.ggpht.com/-rGm2h8cmnmI/Uiaa45V6gwI/AAAAAAAABwI/fUWXgutkh6I/s1600-h/image%25255B4%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-0CZ2O9vh_FE/Uiaa6H4ZTPI/AAAAAAAABwQ/TlTJhwc-lUg/image_thumb%25255B2%25255D.png?imgmax=800" width="340" height="204" /></a></p> <p>那到底使用 AnyCPU 的 assembly 會如何的被地行呢?此時的決策是非常簡單,而且看來也十分有效:</p> <p><strong>當 assembly 使用的是 AnyCPU 平台目標時,且</strong></p> <ul> <li><strong>執行在 32 位元Windows作業系統時,會以 32 位元的方式執行,IL 會被編譯成 x86 的 native code。</strong></li> <li><strong>執行在 64 位元Windows作業系統時,會以 64 位元的方式執行,IL 會被編譯成 x64 的 native code。</strong></li> </ul> <h2>問題</h2> <p>由於目前的64位元電腦 (Windows) 都是32位元相容的,因此一個 assembly 在64位元的電腦只能以 64 位元的方式來執行,恐怕不妙。我常碰到的例子是 Oracle Client。</p> <p>當我們的存取 Oracle 資料庫的程式以 AnyCPU 編譯後,執行在 64 位元的電腦,會以 64 位元的方式來執行。但如果安裝的 Oracle Client 是32位元的呢?32 位元的 Oracle Client 載入 64 位元的程式,就會拋出 <a href="http://msdn.microsoft.com/zh-tw/library/system.badimageformatexception.aspx">System.BadImageFormatException</a> 例外。</p> <h2>Visual Studio 2010</h2> <p>上面的問題持續了3~4年,到底 32 位元與 64位元應用程式好壞也漸漸地有了較明確的選擇。</p> <p><strong>除非明確地需要大量的記憶體,或者需要長整數,否則32位元就已經足夠。64位元的效能還會有一些些下降。</strong></p> <p>因此,在 Visual Studio 2010,建立新專案時,Target Platform(平台目標) 預設就是 x86。 <br />但是,AnyCPU 的assembly 執行方式仍然沒有變。</p> <h2>Visual Studio 2012</h2> <p>到了 Visual Studio 2012又有變化。這個時間點,正巧 ARM CPU (也是32bits)也要進來,因此 32bit === x86 時代正式終結。</p> <p>Visual Studio 2012 建立新專案後的預設選項為 AnyCPU32BitPreferred。 <br />注意一下, Prefer 32-bit 被 disable 掉,是指不能修改,但在.NET Framework 4.5 就可以設定了!</p> <p><a href="http://lh5.ggpht.com/-nYcqXXnuALs/Uiaa6kDE9qI/AAAAAAAABwY/M8y7U6ApHr8/s1600-h/image%25255B13%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-56Iaq8dy_XM/Uiaa7R6nDTI/AAAAAAAABwg/L6GH3nLreMw/image_thumb%25255B7%25255D.png?imgmax=800" width="356" height="199" /></a></p> <p><strong>當 assembly 使用的是 AnyCPU 平台目標時,且</strong></p> <ul> <li><strong>執行在 32 位元Windows作業系統時,會以 32 位元的方式執行,IL 會被編譯成 x86 的 native code。</strong></li> <li><strong>執行在 64 位元Windows作業系統時,會以 64 位元的方式執行,IL 會被編譯成 x64 的 native code。</strong></li> <li><strong>執行在 ARM Windows作業系統時,會以 32 位元的方式執行,IL 會被編譯成 ARM 的 native code。</strong></li> </ul> <h2><font style="font-weight: normal">因此,Perfer 32-bit 可以說是特地為 ARM 設計的。</font></h2> <h2>結論</h2> <p>AnyCPU 從一開始,到目前其定義仍然沒有變動過。也就是「碰到ppp的作業系統,就執行成ppp的程式」,其中 ppp 可以是 32bit, 64bit, ARM。</p> <p>改變的是「建立專案時的預設選項」。</p> <p>也因此,上述 Oracle Client 的問題還是很可能會發生。建議儘可能地明確地指定平台目標(Target Platform),以減少不確定性。</p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-31879964105734796172013-06-14T10:49:00.001+08:002013-06-14T10:56:38.637+08:00System.Transactions 裡的 Timeouts 與 Azure 中的設定<p>在進行交易的過程中,主要有三個 Timeout 時間。而真正的可交易時間,是取下面三者的最小值。</p> <h2><a href="http://msdn.microsoft.com/en-us/library/system.data.idbcommand.commandtimeout.aspx">Command.CommandTimeout</a></h2> <p>這個 timeout 是最基本的 Timeout 時間,預設為 30 秒。這個設定是執行sql指令的可執行時間。</p> <h2><a href="http://msdn.microsoft.com/zh-tw/library/system.transactions.transactionscope(v=vs.100).aspx">TransactionScope</a> 的Timeout</h2> <p>在執行交易時,<a href="http://msdn.microsoft.com/zh-tw/library/system.transactions.transactionscope(v=vs.100).aspx">TransactionScope</a> 也有一個 Timeout 時間。這個時間是由 <a href="http://msdn.microsoft.com/zh-tw/library/system.transactions.transactionscope(v=vs.100).aspx">TransactionScope</a> 的建構子中的參數來指定的。預設值是60秒,可由 <a href="http://msdn.microsoft.com/zh-tw/library/system.transactions.transactionmanager.defaulttimeout.aspx">TransactionManager.DefaultTimeout</a> 取得設定值。</p> <h2><a href="http://msdn.microsoft.com/zh-tw/library/system.transactions.transactionmanager.aspx">TransactionManager</a> 的  MaximumTimeout</h2> <p>TransactionManager 裡頭也有一個 timeout。這個 timeout 時間是是全機的交易管理員的最大可交易的時間。在 .NET 2.0 預設可由子層的 config 或程式來覆寫。但在 .NET 4.0,就不能被子層來覆寫了,如果需要修改,則必須到 %windir%\Microsoft.NET\Framework\v4.0.30319\Config\<strong>machine.config</strong> (32 位元),或 %windir%\Microsoft.NET\Framework64\v4.0.30319\Config\<strong>machine.config</strong> 中以管理員的權限進行修改。</p> <pre class="csharpcode"><system.transactions>
<machineSettings maxTimeout=<span class="str">"02:00:00"</span> />
</system.transactions></pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<h2>Azure 中設定</h2>
<p>微軟的 Windows Azure Cloud Service 環境中,當然我們可以使用遠端桌面的方式,連線到每個伺服器進行上述的修改。但是一旦重新掛載作業系統後,這些人工設定又全部跑掉必須重設,非常不人道。幸好部署時有 <a href="http://msdn.microsoft.com/en-us/library/windowsazure/gg456327.aspx">Start Task</a> 的機制, 可以執行 cmd 的指令。cmd 指令如下</p>
<p>windir%\system32\inetsrv\appcmd set config /commit:MACHINE /clr:4 -section:machineSettings -maxTimeout:02:00:00</p>
<p>此指令必須寫成 .cmd 檔,放在 WebRole 或 WorkerRole 的 project 內,以 content/Always copy to Output Directory 的型式加入專案</p>
<p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiuW0mY2meyyGDGpmxP7BvjP8oZlYyx2nagqhkjZ-sTevnm1IsrASgP1oxapgB27U3y07JernwpM51xlgNS7KMf4LwiyV-GtnUxEWFphUVouhtBABYLiLAm1DCOG-97Sn_0ZOaUomcLUw/s1600-h/image%25255B2%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-CeWCPho583M/UbqExKce0yI/AAAAAAAABtU/WC62smSlZ1U/image_thumb.png?imgmax=800" width="136" height="244" /></a><a href="http://lh4.ggpht.com/-d0kHHkGyRSk/UbqExymS48I/AAAAAAAABtc/iLD-fFRhCgA/s1600-h/image%25255B5%25255D.png">   <img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-HZJ1j7i59Ho/UbqEyW2JcaI/AAAAAAAABtk/uTMwosWfJ_Q/image_thumb%25255B1%25255D.png?imgmax=800" width="244" height="130" /></a></p>
<p>接著,在Azure 專案的 ServiceDefinition.csdef 中加上 <a href="http://msdn.microsoft.com/en-us/library/windowsazure/gg456327.aspx">Startup Task</a> 的指令</p>
<pre class="csharpcode"><span class="kwrd"><</span><span class="html">Startup</span><span class="kwrd">></span>
<span class="kwrd"><</span><span class="html">Task</span> <span class="attr">commandLine</span><span class="kwrd">="timeout.cmd"</span> <span class="attr">executionContext</span><span class="kwrd">="elevated"</span> <span class="attr">taskType</span><span class="kwrd">="simple"</span> <span class="kwrd">/></span>
<span class="kwrd"></</span><span class="html">Startup</span><span class="kwrd">></span></pre>
<p>如下圖</p>
<p><a href="http://lh3.ggpht.com/-14pa2Lip7G0/UbqEy8SNWxI/AAAAAAAABts/BA7Sp6rw-8o/s1600-h/image%25255B8%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-nGEGea5haDw/UbqEzYSj6SI/AAAAAAAABt0/maYuEfWJQqg/image_thumb%25255B2%25255D.png?imgmax=800" width="244" height="108" /></a></p>
<p>其中 executeContext=”elevated” 指的是必須以管理員的權限進行修改</p>
<h2>結論</h2>
<p>TransactionScope 的 Timeout 設定有點複雜,除了.NET 版本,32/64 版本,%windir%\system32\ 與 %windir%\SysWOW64\ 的不同外,現在又增加了雲端的設定。真是不太容易。</p>
<h2>參考</h2>
<ol>
<li><a title="http://stackoverflow.com/questions/1348191/default-transaction-timeout" href="http://stackoverflow.com/questions/1348191/default-transaction-timeout">http://stackoverflow.com/questions/1348191/default-transaction-timeout</a> </li>
<li><a title="https://github.com/Aaronontheweb/azure-webroleperformance-scripts" href="https://github.com/Aaronontheweb/azure-webroleperformance-scripts">https://github.com/Aaronontheweb/azure-webroleperformance-scripts</a> </li>
<li><a title="http://blogs.inkeysolutions.com/2012/01/managing-timeouts-while-using.html" href="http://blogs.inkeysolutions.com/2012/01/managing-timeouts-while-using.html">http://blogs.inkeysolutions.com/2012/01/managing-timeouts-while-using.html</a> </li>
</ol> Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2799539975875855123.post-82149572868349694232013-06-13T19:19:00.001+08:002013-06-13T19:19:00.354+08:00jQuery 取得 checkbox 至少有一個選取<p>客戶的需求中,「當使用者至少要選取一筆資料才能進行下一個動作」。常見的 UI 設計,當然是使用 checkbox。</p> <p>而我的 case,是資料有一萬多筆,此時整個網頁非常痴肥而難以接受。問題是,客戶就是要這樣的網頁,<strong>客戶拒絕分頁</strong>。</p> <h2>jQuery length</h2> <p>問題來了,此時我使用了如下的 jQuery 語法查詢是否有選取一個 checkbox</p> <pre class="csharpcode"><span class="kwrd">var</span> isChecked = $(<span class="str">'input[name=chk]:checked'</span>).length > 0;</pre>
<p><style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style></p>
<p>相當然爾,網頁就硬生生當在那裡,動也不能動。效能不好</p>
<h2><a href="http://api.jquery.com/is/">jQuery is</a></h2>
<p>根據我「多年」「 .NET」的經驗,使用 length 等同於計算所有被勾選的項目,然後再計算出總筆數,這樣的效能當然不好啊。於是趕快找一找 jQuery document,很快的就發現了 jQuery is 非常符合我的需求。於是馬上改了程式</p>
<div id="codeSnippetWrapper" style="overflow: auto; cursor: text; font-size: 8pt; border-top: silver 1px solid; font-family: 'Courier New', courier, monospace; border-right: silver 1px solid; border-bottom: silver 1px solid; padding-bottom: 4px; direction: ltr; text-align: left; padding-top: 4px; padding-left: 4px; margin: 20px 0px 10px; border-left: silver 1px solid; line-height: 12pt; padding-right: 4px; max-height: 200px; width: 97.5%; background-color: #f4f4f4">
<div id="codeSnippet" style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: 'Courier New', courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; line-height: 12pt; padding-right: 0px; width: 100%; background-color: #f4f4f4">
<pre style="border-top-style: none; overflow: visible; font-size: 8pt; border-left-style: none; font-family: 'Courier New', courier, monospace; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum1" style="color: #606060"> 1:</span> <span style="color: #0000ff">var</span> isChecked = $(<span style="color: #006080">'input[name=chk]'</span>)<span style="color: #0000ff">is</span>(<span style="color: #006080">':checked'</span>);</pre>
<!--CRLF--></div>
</div>
<p>滿心期待效能飛快,但「更慢了」。怎麼會…</p>
<h2>效能比較</h2>
<p>找到一個<a href="http://jsperf.com/jquery-check-if-any-checkboxes-are-checked">測試</a>,也證實了這樣的結果。怎麼會這樣…</p>
<p>另外,又找了一個 <a href="http://jsperf.com/checkboxtests/2">checkboxtests</a>,這次加入了自己寫的 .each() 來測試是否會比較快?結論是:不會。</p>
<h2>心得</h2>
<p>到了 javascript 的世界,以前許多經驗值就必須大打折扣了。</p> Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-2799539975875855123.post-39907472087637241262013-06-03T19:27:00.001+08:002013-06-11T19:28:05.324+08:00將 Visual Studio 打包好的 package 佈署到 IIS 6<p>之前的許多經驗,都是把打包好的 package 佈署到 IIS 7 以上的版本。此中又依據權限,再分成管理員權限的佈署及<a href="http://charlesbc.blogspot.tw/2012/05/aspnet.html">非管理員權限的佈署方式</a>。</p> <p>這次,我被要求佈署到 IIS 6 上了。</p> <h2>IIS 6</h2> <p>我之前的態度,是一味地以「Windows Server 2003 大舊了,現在沒有人在用了」來推託一翻。雖然言之有理,但其是一大部份原因是:懶! <br />然而,債還是要還的。客戶出錢,我們做人家小的還是要出力,即使入不敷出。</p> <p>IIS 6 與之後的 IIS 7有個根本上的不同,是IIS 7 對 metabase 的全面改版,並且 IIS 7 可支援非管理員來管理 IIS。在 Visual Studio 發行的結果,是對 Web Deploy 是再包裝過精簡後的工具,處理的對象是  IIS 7 的 metabase。對於 IIS 6,只能自行尋找文件。</p> <p>如果直接使用 Visual Studio 所產出的 cmd 指令執行到 IIS 6,會出現如下的錯誤訊息。</p> <p><a href="http://lh5.ggpht.com/-gJqvAr9Q42c/Uax9s2sp_rI/AAAAAAAABsg/ge9ExBF1msg/s1600-h/SNAGHTML243900aa%25255B4%25255D.png"><img title="SNAGHTML243900aa" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="SNAGHTML243900aa" src="http://lh3.ggpht.com/-AufijU2f5-g/Uax9tkJo8fI/AAAAAAAABso/fo4Flf_71KM/SNAGHTML243900aa_thumb%25255B1%25255D.png?imgmax=800" width="293" height="91" /></a></p> <h2>使用 MSDeployAgentService</h2> <p>在同一個目錄中,可以找到 Visual Studio 為我們寫好的 readme 檔案,其實裡面已經寫的很清楚了,是可以使用這些工具部署到 IIS 6的。</p> <pre class="csharpcode">The service URL can also be in the following format:
http://<span class="kwrd"><</span><span class="html">DestinationServer</span><span class="kwrd">></span>/MSDeployAgentService
This format requires administrative rights on the destination server, and it requires that Web Deploy Remote Service (MsDepSvc) be installed on the destination server. IIS 7 does not have to be installed on the destination server.</pre>
<p><style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style></p>
<p>也就是說, 我們必須使用 <a href="http://serverName/MSDeployAgentService">http://serverName/MSDeployAgentService</a> 使用管理員權限來進行部署。</p>
<p>改一下指令,如下</p>
<pre class="csharpcode">package.cmd /T /M:http://localhost/MSDeploymentService</pre>
<p><style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style></p>
<p>結果不如人願,非常類似的錯誤訊息還是打擊了我一下。</p>
<p><a href="http://lh3.ggpht.com/-Ni70nsPTRsM/Uax9uZkJ71I/AAAAAAAABsw/Otu8Z-UPQQw/s1600-h/SNAGHTML2429b1de%25255B3%25255D.png"><img title="SNAGHTML2429b1de" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="SNAGHTML2429b1de" src="http://lh3.ggpht.com/-h7nKUFi1HMs/Uax9vItCv8I/AAAAAAAABs4/DMYyuLGPaS8/SNAGHTML2429b1de_thumb.png?imgmax=800" width="244" height="146" /></a></p>
<h2>解法</h2>
<p>注意到了問題了嗎?另一個重點在於 Metabase 路徑,新舊版本不一樣。所以,我偷偷修改了SetParameters.xml,由原來的</p>
<pre class="csharpcode"><span class="kwrd"><</span><span class="html">setParameter</span> <span class="attr">name</span><span class="kwrd">="IIS Web Application Name"</span> <span class="attr">value</span><span class="kwrd">="Default Web Site/myApp"</span> <span class="kwrd">/></span></pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>改成</p>
<pre class="csharpcode"><span class="kwrd"><</span><span class="html">setParameter</span> <span class="attr">name</span><span class="kwrd">="IIS Web Application Name"</span> <span class="attr">value</span><span class="kwrd">="/lm/w3svc/1/ROOT/myApp"</span> <span class="kwrd">/></span></pre>
<pre class="csharpcode"><span class="kwrd"></span></pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>再執行相同的指令</p>
<p>package.cmd /T /M:http://localhost/MSDeploymentService</p>
<p>就完成了我的需求了。</p>
<p>其實,如果是在本機的話,指定機器的 /M 指令也不用加了。只需要</p>
<p>package.cmd /T 即可</p>
<h2>進階</h2>
<p>由於使用了 MSDeploymentService,就必須使用管理員的權限。既然是管理員權限,在別台機器(只需要安裝 <a href="http://www.iis.net/downloads/microsoft/web-deploy">Web Deploy Tool</a>)當然也可以下指令,不必遠端桌面登入到該伺服器。</p>
<p>package.cmd /Y /M:<a href="http://serverIpOrHostName/msdeployagentService">http://serverIpOrHostName/msdeployagentService</a> /U:administrator /P:Password</p>
<p>PS: 對部署來說,這個權限要求實在大到不行,對於無限上綱的資訊安全管理說,就是很好發揮的題材。誰叫你還要用 Windows Server 2003 呢?</p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-16064054163250423852013-05-10T10:58:00.001+08:002013-05-10T10:58:35.303+08:00IE8 與 Knockout js<p>客戶抱怨網頁呈現不正確。資料出不來。</p> <p>看了一下,客戶使用的是 IE8 on Windows 7。天啊!算很新的系統,但就是不肯更新 IE 版本。</p> <h2>問題在 Knockoutjs</h2> <p>我用IE 10 按F12 開發者工具,檢查一下錯誤的 javascript </p> <p><a href="http://lh4.ggpht.com/-9HS01Khhqzo/UYxiU0NcAyI/AAAAAAAABrI/soD_Qj5Rdjc/s1600-h/image%25255B3%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-F2-J5dYlSTc/UYxiWPSlhjI/AAAAAAAABrQ/RJnozlLsTf4/image_thumb%25255B1%25255D.png?imgmax=800" width="398" height="94" /></a></p> <p>SCRIPT5022: Unable to parse bindings. <br />Message: SyntaxError: Expected identifier, string or number; <br />Bindings value: text: CompanyName, attr: { for: 'c' + TaxNo()} <br /></p> <p>binding 的 html 如下</p> <pre class="csharpcode"><span class="kwrd"><</span><span class="html">label</span> <span class="attr">data-bind</span><span class="kwrd">="attr:{for: 'r' + ReportHeaderId()}, text: ReportName"</span><span class="kwrd">></</span><span class="html">label</span><span class="kwrd">></span></pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<h2>原因</h2>
<p>舊版本IE 會將 for: 當成 javascript 的保留字,想把它當成 javascript 來跑,因而錯誤。</p>
<h2>解法</h2>
<p>加上單引號,變成字串即可</p>
<pre class="csharpcode"><span class="kwrd"><</span><span class="html">label</span> <span class="attr">data-bind</span><span class="kwrd">="attr:{<strong><em><font color="#ff0000">'for'</font></em></strong>: 'r' + ReportHeaderId()}, text: ReportName"</span><span class="kwrd">></</span><span class="html">label</span><span class="kwrd">></span></pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-82967715167101877032013-05-08T08:58:00.001+08:002013-05-08T08:58:30.941+08:00There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference<h2>問題</h2> <p>使用Visual Studio 2012 建置專案時,出現了如下的錯誤</p> <p>Warning    6    There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "msshrtmi, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=AMD64", "AMD64". This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project.    </p> <h2>原因</h2> <p>我在這個專案使用了 Windows Azure的雲端 assembly msshrtmi,並且指定了 x64的版本。但在建置的設定上,卻指定為 Any CPU。雖然編譯會過,但一定要部署到 x64 的作業系統才能正常運作。</p> <p>在 .NET 4.5 後 ,編譯會多出這樣的警告。</p> <h2>解決</h2> <p>一直出現這樣的警告實在很惱人。把該專案的 Platform target 設成 x64 就解決了這個問題</p> <p><a href="http://lh6.ggpht.com/-5ma9FHhMse4/UYmjMrruM5I/AAAAAAAABqo/W_yJQ6d_FOM/s1600-h/image%25255B3%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-29z098moKIw/UYmjNexD53I/AAAAAAAABqw/lUXj-686CA0/image_thumb%25255B1%25255D.png?imgmax=800" width="399" height="213" /></a></p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-26464912688320584632013-05-08T08:20:00.001+08:002013-05-08T08:20:37.327+08:00解決 TFS Build 時 出現 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets (983) 的警告<h2>問題</h2> <p>當我在 Team Foundation Server 上佇列一個新的組建後,組鍵的結果常常跑出一堆的警告。如下</p> <p>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets (983): The reference assemblies for framework ".NETFramework,Version=v4.5" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend.</p> <p>不處理,好像也沒什麼事。只是,一直覺得怪怪的。</p> <h2>解法</h2> <p>原來,雖然我在 Build Server 上有安裝了 .NET Framework V4.5, 可以順利的建置,仍然會出現上述的警告。在Build Server 上安裝  <a href="http://msdn.microsoft.com/en-us/windows/desktop/hh852363.aspx">Windows Software Development Kit (SDK) for Windows 8</a> 後,就不會再出現這些惱人的警告了。</p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-1594136954813004782013-03-15T19:06:00.001+08:002013-03-15T19:06:40.707+08:00WCF Data Services 使用 JSON 格式<p>好久沒有使用 WCF Data Services 了。</p> <p>這次 Demo 時,意外發現 WCF Data Services 在 5.3 時(其實更早)已經內建支援 JSON 格式,只是瀏覽器上不太容易試出來。下面,我們就一步步寫出來吧!</p> <h2>STEP1 資料</h2> <p>找一個資料庫吧。我使用 VS2012,隨便開一個 SQL Server (不能是 LocalDB,否則掛在 IIS 上會有問題)。</p> <pre class="csharpcode"><span class="kwrd">CREATE</span> <span class="kwrd">TABLE</span> [dbo].[Users](
[EmpNo] [<span class="kwrd">char</span>](8) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>,
[EmpName] [nvarchar](10) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>,
[Password] [<span class="kwrd">varchar</span>](64) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>,
<span class="kwrd">CONSTRAINT</span> [PK_Users] <span class="kwrd">PRIMARY</span> <span class="kwrd">KEY</span> <span class="kwrd">CLUSTERED</span>
(
[EmpNo] <span class="kwrd">ASC</span>
)<span class="kwrd">WITH</span> (PAD_INDEX = <span class="kwrd">OFF</span>, STATISTICS_NORECOMPUTE = <span class="kwrd">OFF</span>, IGNORE_DUP_KEY = <span class="kwrd">OFF</span>, ALLOW_ROW_LOCKS = <span class="kwrd">ON</span>, ALLOW_PAGE_LOCKS = <span class="kwrd">ON</span>) <span class="kwrd">ON</span> [<span class="kwrd">PRIMARY</span>]
) <span class="kwrd">ON</span> [<span class="kwrd">PRIMARY</span>]</pre>
<p><style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>寫入一兩筆料吧。</p>
<p><a href="http://lh3.ggpht.com/-6FVl6sNzfQk/UUMAbCLvg4I/AAAAAAAABls/LNrs7Hr4YmE/s1600-h/image%25255B2%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-1VucjexoWTg/UUMAb4-9EoI/AAAAAAAABl0/7wZ_0M1cIbM/image_thumb.png?imgmax=800" width="244" height="126" /></a></p>
<h2>STEP2 EDMX</h2>
<p>建立一個Empty ASP.NET application專案(使用 IIS,為了後面Fiddler 能錄到 json 格式)後,再建立一個  ado.net entity model,並且加入剛剛的 Table 作為測試的 Entity Set</p>
<p><a href="http://lh4.ggpht.com/-8kqaX1HKkm4/UUMAcZ7fsAI/AAAAAAAABl8/mcI9I_8p058/s1600-h/image%25255B5%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-BG4is0oz2sY/UUMAc1u5bWI/AAAAAAAABmE/jpsrFKtvxds/image_thumb%25255B1%25255D.png?imgmax=800" width="244" height="214" /></a>  <a href="http://lh6.ggpht.com/-6-2ivjWyEEk/UUMAe2wXiOI/AAAAAAAABmU/pXc49UCLaW8/s1600-h/image%25255B8%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-58m0L8iWk9A/UUMAfeEsfzI/AAAAAAAABmc/C-I5P7m7yAk/image_thumb%25255B2%25255D.png?imgmax=800" width="244" height="205" /></a></p>
<p>並且,IIS 對應的 Application Pool 先改用 LocalSystem</p>
<p><a href="http://lh5.ggpht.com/-LCISU4emQLY/UUMAf9Pq0HI/AAAAAAAABmk/JTK-aJQ6iWY/s1600-h/SNAGHTML56e33f7%25255B3%25255D.png"><img title="SNAGHTML56e33f7" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="SNAGHTML56e33f7" src="http://lh5.ggpht.com/-PbrtOTfZKFI/UUMAgaEcXqI/AAAAAAAABms/yRKefPsW_y4/SNAGHTML56e33f7_thumb.png?imgmax=800" width="244" height="143" /></a></p>
<p> </p>
<h2>STEP3 建立 Data Service</h2>
<p>建立一個名為 DemoWcfDataService.svc,並且修改對應的程式如下</p>
<p><a href="http://lh3.ggpht.com/-OCvupWj-YzA/UUMAg-0IMEI/AAAAAAAABm0/SrgH5Ce2Z_c/s1600-h/SNAGHTML548f7d1%25255B4%25255D.png"><img title="SNAGHTML548f7d1" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="SNAGHTML548f7d1" src="http://lh5.ggpht.com/-Zn48juC9lsI/UUMAhotLLvI/AAAAAAAABm8/pshua74SdTY/SNAGHTML548f7d1_thumb%25255B1%25255D.png?imgmax=800" width="344" height="184" /></a></p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> DemoWcfDataService : DataService<DemoEntities>
{
<span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule(<span class="str">"*"</span>, EntitySetRights.AllRead);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
}
}</pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<h2>執行</h2>
<p><a title="http://localhost:51840/DemoWcfDataService.svc/Users" href="http://localhost/DS5Service/DemoWcfDataService.svc/Users">http://localhost/DS5Service/DemoWcfDataService.svc/Users</a> </p>
<p>果然是 xml 格式</p>
<p><a href="http://lh4.ggpht.com/-f7gALZY9-_I/UUMAiCDUNQI/AAAAAAAABnE/rDe7PjDNu50/s1600-h/image%25255B11%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-adlC-pY0bk8/UUMAi3cJgeI/AAAAAAAABnM/XFiSp0RASR4/image_thumb%25255B3%25255D.png?imgmax=800" width="244" height="178" /></a></p>
<p>但如果執行 <a title="http://localhost/DS5Service/DemoWcfDataService.svc/Users/?$format=json" href="http://localhost/DS5Service/DemoWcfDataService.svc/Users/?$format=json">http://localhost/DS5Service/DemoWcfDataService.svc/Users/?$format=json</a>,則會回傳 400 的 http status code,意思就是不支援。</p>
<p><a href="http://lh6.ggpht.com/-emcEKecYQvU/UUMAjm0E8zI/AAAAAAAABnU/92IFNPRM0hY/s1600-h/image%25255B16%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-Zjffuuu7O_E/UUMAkMElMoI/AAAAAAAABnc/99XtSIRPfZE/image_thumb%25255B6%25255D.png?imgmax=800" width="363" height="76" /></a></p>
<h2>STEP4 更新成 DS 5.3</h2>
<p>在專案上使用 NuGet,更新成 DS 5.3</p>
<p><a href="http://lh3.ggpht.com/-oK3uEDS_FNw/UUMAlJlHcKI/AAAAAAAABnk/dYbrzOC4Jdk/s1600-h/SNAGHTML5559799%25255B3%25255D.png"><img title="SNAGHTML5559799" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="SNAGHTML5559799" src="http://lh6.ggpht.com/-IM6_PLnQbkc/UUMAlu-EQlI/AAAAAAAABns/erpd83P5i10/SNAGHTML5559799_thumb.png?imgmax=800" width="244" height="137" /></a></p>
<p>再執行一下相同的 URL, 就得到了 JSON格式的資料了</p>
<p><a href="http://lh4.ggpht.com/-7EFpwsWcXnc/UUMAmX43zNI/AAAAAAAABn0/3BC7Xb9EsVQ/s1600-h/image%25255B20%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-i8f5JrQnEOk/UUMAmxrqntI/AAAAAAAABn8/1dhVmSr1j28/image_thumb%25255B8%25255D.png?imgmax=800" width="287" height="33" /></a></p>
<p><a href="http://lh3.ggpht.com/-Dbyd7Gqb4Go/UUMAncAyZrI/AAAAAAAABoE/Z_EA1wy-CN8/s1600-h/image%25255B23%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-7Olefb-S4pA/UUMAnyq-ayI/AAAAAAAABoM/yd2XyBiiJt4/image_thumb%25255B9%25255D.png?imgmax=800" width="218" height="244" /></a></p>
<p>嗯!感覺真好。</p>
<h2>STEP5 Client Side</h2>
<p>那 Client side 如何取得 json 的資料呢?建立一個 Console Application ,並且 Add Service Reference,如下</p>
<p><a href="http://lh5.ggpht.com/-mfEFCv_f8Wc/UUMAofJgaWI/AAAAAAAABoU/BJgOVGSMSqA/s1600-h/SNAGHTML56307aa%25255B4%25255D.png"><img title="SNAGHTML56307aa" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="SNAGHTML56307aa" src="http://lh4.ggpht.com/-731Hnu19z9Q/UUMApLbcK_I/AAAAAAAABoc/d1FdpIJhM2M/SNAGHTML56307aa_thumb%25255B1%25255D.png?imgmax=800" width="286" height="232" /></a></p>
<p>程式如下</p>
<pre class="csharpcode"><span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)
{
var context = <span class="kwrd">new</span> DemoEntities(<span class="kwrd">new</span> Uri(<span class="str">"http://myhost/DS5Service/DemoWcfDataService.svc"</span>));
var users = context.Users;
<span class="kwrd">foreach</span> (var user <span class="kwrd">in</span> users)
Console.WriteLine(user.EmpName);
}</pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>程式可正常執行。但使用的並不是JSON 格式</p>
<h3>STEP6 Client 更新成 DS 5.3</h3>
<p><a href="http://lh3.ggpht.com/-J_uDDM0LarQ/UUMAp-lkzLI/AAAAAAAABok/JLtaVm72_hA/s1600-h/SNAGHTML57d15ae%25255B4%25255D.png"><img title="SNAGHTML57d15ae" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="SNAGHTML57d15ae" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9rDyV1sKCTL446SmqYDh3x8pMCnO7xVWNLAe0oeyUYPolidUgMDIEAC9pcQb8XYAnYTW6780XFoxBpzsF7YqcaWNicsenCxL-Unxwi3RKSyOBOqbrZRoP8ybeOW2IvRQWHiHqLgNK1OE/?imgmax=800" width="286" height="160" /></a></p>
<p>接下來,要將 System.Data.Services.Client 移除,因為這已經被 Microsoft.Data.Services.Client 取代了</p>
<p><a href="http://lh3.ggpht.com/-lVohdrtQD6I/UUMAq5s8o7I/AAAAAAAABo0/V9n0we-yAn0/s1600-h/image%25255B29%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-x2ROISQOU0I/UUMArkNMzjI/AAAAAAAABo8/eRZtPU6bIV4/image_thumb%25255B11%25255D.png?imgmax=800" width="224" height="244" /></a></p>
<p>增加下面兩行程式,說明我們要使用 JSON 格式</p>
<p>context.Format.LoadServiceModel();
<br />            context.Format.UseJson();</p>
<p><a href="http://lh6.ggpht.com/-MbJTMu110ow/UUMAsMxubXI/AAAAAAAABpE/Dn0lVIiZF9Y/s1600-h/image%25255B32%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-xZCwQkoI9Ws/UUMAsj5g7sI/AAAAAAAABpM/iigTXIasEUI/image_thumb%25255B12%25255D.png?imgmax=800" width="244" height="104" /></a></p>
<p>執行結果竟是:System.NullReferenceException: Object reference not set to an instance of an object.</p>
<p><a href="http://lh6.ggpht.com/-FGxeiC-6XWw/UUMAtIwqR2I/AAAAAAAABpU/0jCR-IHzkbI/s1600-h/image%25255B35%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-CBFaLsxNKYE/UUMAtrk0J9I/AAAAAAAABpc/58UNHVc-7o4/image_thumb%25255B13%25255D.png?imgmax=800" width="244" height="62" /></a></p>
<h2>STEP7 安裝 DS Tools 5.3 </h2>
<p>找到 <a title="http://www.microsoft.com/en-us/download/details.aspx?id=35840" href="http://www.microsoft.com/en-us/download/details.aspx?id=35840">WCF Data Services 5.3.0 RTM Tools Installer</a>, 先關掉 Visual Studio 2012 後安裝 WcfDataServices.exe。</p>
<p>再打開solution,  刪除舊的 Service Reference,重新執行 STEP5 後,重新執行程式。就正常了 。</p>
<p><a href="http://lh6.ggpht.com/-wyYoUz-Xi2o/UUMAuJ520DI/AAAAAAAABpk/fjzpIa7oZyU/s1600-h/image%25255B41%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-RVCv9J_a50M/UUMAukfBV3I/AAAAAAAABps/qlIMPvx_-rc/image_thumb%25255B15%25255D.png?imgmax=800" width="244" height="203" /></a></p>
<h2>結論</h2>
<p>使用 Fiddler 錄一下 Request / Response,使用JSON 格式的資料遠小於 xml 格式 (253 vs. 2044) 真的省好多哦!</p>
<p><a href="http://lh5.ggpht.com/-I_HVN-i2oIU/UUMAvVDEYNI/AAAAAAAABp0/iT3gvDFQgoc/s1600-h/image%25255B44%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-nw7T0OV-yKs/UUMAv_YicGI/AAAAAAAABp8/z5YcgHX7EC0/image_thumb%25255B16%25255D.png?imgmax=800" width="244" height="137" /></a></p> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2799539975875855123.post-7765474963547088942013-02-27T09:52:00.001+08:002013-03-13T10:51:57.455+08:00假 Facebook email 攻擊使用者電腦的 java 的漏泂<p>今天早上我收到兩封信,其中一封假裝有人給了我照片的意見,如下</p> <p><a href="http://lh5.ggpht.com/-TJr9dudkZlQ/US1m6nmNC8I/AAAAAAAABk8/rmifHQdQsqg/s1600-h/SNAGHTML18d44ebd%25255B4%25255D.png"><img title="SNAGHTML18d44ebd" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="SNAGHTML18d44ebd" src="http://lh4.ggpht.com/-VS7XUvFeFQ8/US1m68tnltI/AAAAAAAABlE/tcpN3Sbec-k/SNAGHTML18d44ebd_thumb%25255B1%25255D.png?imgmax=800" width="448" height="376" /></a></p> <p>連結指向的網址,當然不是 Facebook 的官網。</p> <p>我找了一台虛擬機(之後可再還原)試了一下該網址,看了一下 html code.</p> <p>果然是攻擊時下最夯的 java 漏洞。<a href="http://news.now.com/home/international/player?newsId=56521">美指JAVA有安全漏洞籲停用</a>。這可是通過美國政府認證的哦!</p> <p>即使後來 Oracle 出了 Java 7 Update 11, 但<a href="http://www.ettoday.net/news/20130115/152885.htm">Java更新補漏洞 美國土安全部仍說勿用</a>! <br /></p> <p><a href="http://lh6.ggpht.com/-II80a3EjlwQ/US1m7T9LdrI/AAAAAAAABlM/VcD579GU-aE/s1600-h/clip_image004%25255B5%25255D.jpg"><img title="clip_image004" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="clip_image004" src="http://lh4.ggpht.com/-JwOaCkU0vJA/US1m76zT8-I/AAAAAAAABlU/-dv0c-pkpbc/clip_image004_thumb%25255B2%25255D.jpg?imgmax=800" width="499" height="340" /></a></p> <p>反正現在很少網站使用 Java Applet 了,將它關掉或移除吧!</p> <p> </p> <p>ps: 不知道現在最新的 update 15 解決了這個問題沒有?</p> <p>2013/3/10 : <a href="http://www.ithome.com.tw/itadm/article.php?c=79160">兩次更新徒勞無功,Java再爆嚴重漏洞</a> ,所以目前(2013/3/13) 還是不安全</p> Unknownnoreply@blogger.com0