發表文章

目前顯示的是 八月, 2014的文章

檔案上傳的一些疑惑

圖片
這幾天在寫檔案上傳的程式時針對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 WebJobsHangfire或進階點使用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 StreamWriter(file)…

[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...等