發表文章

檔案上傳的一些疑惑

圖片
這幾天在寫檔案上傳的程式時針對Stream的讀寫有些疑惑一直無法搞懂,survery了一些文章後,將搞懂的整理如下: Client透過什麼樣的方式,傳送給Server端?    在送出的表單設定Content-Type:multipart/form-data,此為將表單內若有其他不同類型資料時需包成一個Request,並將檔案轉成2進位透過Post送出。送出前透過boundary=" 分隔的識別字串 "來區隔送出的資料,如下圖boundary=----WebKitFormBoundaryEZDuDWbyAS56kbIR分隔2個欄位,一個為輸入文字(123),另一個為上傳檔案。 Client端送出後,Server端接收到的檔案Stream來源為何?    IIS收到資料後會將完整的內容暫存在Temp File內,而應用程式再將相關資訊讀出,例:Controller收到的FormCollection及HttpPostedFileBase檔案上傳物件。HttpPostedFileBase.InputStream的基底類別是FileStream,用來讀取暫存檔內屬於上傳檔案的部份。這也是釐清為何在觀察w3wp.exe,在Server端還未讀取Stream的資料時,記憶體不會增加。 圖:為HttpPostedFileBase.InputStream Trace後的資訊 參考來源 http://huan-lin.blogspot.com/2012/04/about-aspnet-file-upload.html

[.NET4.5.2] 背景工作另一選擇QueueBackgroundWorkItem

目前在Web上若要支援背景工作 例:圖片轉檔、資料轉入等離線工作,有幾種選擇,如: Azure WebJobs 、 Hangfire 或進階點使用 Azure Worker Role 等。除了Hangfire(第三方套件)以外,其他2者需執行在Azure的環境上。而目前在.net4.5.2有另一選擇QueueBackgroundWorkItem .NET 4.5.2內建的QueueBackgroundWorkItem 此功能與ThreadPool.QueueUserWorkItem一樣都是記憶體的序列,但不同的是它支援非同步await/async功能以及會自動保持與追蹤有多少個未完成的工作,並且在應用程式被關閉時(例:更新程式、IIS回收等)會試著延遲90秒直到所有工作完成,當然超過90秒後未完成的工作 就會遺失 。若你的背景工作是與交易較無關的功能,如發信通知,建議可以使用此API。 protected void Button1_Click(object sender, EventArgs e) { for (int i = 0; i < 100; i++) { string root = Server.MapPath("~/Log"); HostingEnvironment.QueueBackgroundWorkItem(ct => WriteFileLog(root, "Hello world!")); } } private async Task WriteFileLog(string root, string message) { FileStream file = new FileStream(root + "\\" + Guid.NewGuid().ToString("n") + ".txt", FileMode.Create); StreamWriter s = new Stre...

[AngularJS] 多個app在同一個網頁

圖片
在同一個網頁內若設定多個module,在預設情況下只會執行第一個設定ng-app的內容,第二個ng-app設定則不會執行,如下方的View內容 <div ng-app="app1" class="panel panel-primary"> <div class="panel-heading">Directive-Static Template</div> <div ng-controller="myCtrl" class="panel-body"> Name:{{customer.name}} Address:{{customer.address}} </div> </div> <div id="app2" ng-app="restrictApp" class="panel panel-info"> <div class="panel-heading">Directive-Restrict</div> <div ng-controller="myCtrl" class="panel-body"> Name:{{customer.name}} Address:{{customer.address}} </div> </div> app2的angularJs並 不會被執行

使用clientCache快取靜態檔案

圖片
     針對Client端的靜態檔案(js、css、圖檔等),在第一次瀏覽器載入時會對Server發出Request來下載,而在第二次載入時,同樣會再發出一次Request來詢問,並依Client及Server檔案的修改時間來判斷是否需下載。因為只有回應標頭內容,不用下載檔案內容,所以在第2次載入會明顯比較快。   若這些靜態檔案若都沒有在修改的話,在IIS7以上可以透過web.config直接設定快取的模式及過期時間,來快取在Client端,這樣第2次載入時連Request都不會發出。 增加clientCache組態-設定 在system.webServer/staticContent下加入設定,cacheControlMode設定為 UseMaxAge ,並設定對應的屬性 cacheControlMaxAge 來設定快取時效, 如下快取10秒 <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="00:00:10"/>

[AngularJS] Modal的Scope Bug

圖片
今天在使用ui.bootstrap.modal時遇到一個奇怪的問題,透過ng-modal繫結的資料在View可以呈現即時更新的資料,但在controoler卻無法取回。 程式如下: html 紅框內可正確呈現雙向繫結的資料

[AngularJS] 開發環境準備

圖片
這陣子在專案使用AngularJS開發程式,並在Nuget引用了相關套件,例:AngularJs、ng-grid、定義檔等.......,避免日後記憶衰退忘光光,將用到的整理如下: 1.AngularJS 完整的AngularJS檔案下,並包含其他模組,例:Route、Cookie...等

[Azure] 解決無法使用gmail的smtp寄信

圖片
  在系統上作了一個通知機制是當發生例外時,會透過gmail發信給管理者。但上了Azure後,明明有例外,卻遲遲收不到來信.......。到gmail上的設定檢查後,才知道由於網站是放在新加坡與我們平常存取時的位置差太遠,所以判定為異常而遭拒無法發信。

[Azure] Instance資源分配

圖片
釐清一下Instance的資源是怎麼樣分配。以Basic的方案來計算,若建立3個Instance(VM),而記憶體設定為7G,並建立了3個網站。 在分配上如下表 Instance RAM Web VM-1 7G Web-1 Web-2 Web-3 VM-2 7G Web-1 Web-2 Web-3 VM-3 7G Web-1 Web-2 Web-3 參考來源 http://msdn.microsoft.com/zh-tw/windowsazure/gg442342.aspx http://social.msdn.microsoft.com/Forums/zh-TW/bc646281-b411-4584-907d-1098e21b7a1b/azure-instance-?forum=winazurewebsite

Visual Studio Online MsBuild出現無法載入Nuget組件

圖片
目前的專案會透過Visual Studio Online簽入後,自動執行建置動作並發佈到Azure。但今天在測試時一直卡在Online Build時會發生錯誤訊息,無法載入某個內部Nuget組件。

[EntityFramework] 查詢結果將字串轉成列舉

圖片
在EntityFramework5後若你希望Entity的欄位是列舉型別,預設支援數值欄位例:int16 int32 Byte等。但若欄位是字串時,該如何處理? 如下的列舉是對應的Char型別 public enum TrCodes { A = 'A', O = 'O', S = 'S', T = 'T', P = 'P', } 試著在查詢時將Entity的欄位轉成列舉