[ASP.NET]ASP.NET 4.0 Overview-Core Services
ASP.NET 4.0 Beta 2跟VS2010 Beta 2推出都1-2個月了,還沒有時間把他的White paper跟IDE裝起來玩一下,今天晚上總算將White paper看了一遍,有興趣的人可以到這個網址看看細節:
ASP.NET 4 and Visual Studio 2010 Web Development Beta 2 Overview
時間如果允許的話,我希望能將以下幾個大章節都帶過一遍:
New Features in the Microsoft Ajax Library
Visual Studio 2010 Web Designer Improvements
Web Application Deployment with Visual Studio 2010
而本篇我們先著重在Core Services的部分,來看看ASP.NET 4.0在核心服務的部分提供了哪些新功能:
若你開發ASP.NET已經有一段時日,對於站台的web.config結構應該不會太陌生,在建立起站台時,許多不知作用的tag也被一起建立起來了,而這個問題在4.0將被解決,多數的設定功能已經被移到machine.config中,而透過組態繼承的效果,讓站台的web.config不用再做這些設定,所以4.0的web.config一開始的內容只有這樣,真的超級精簡:
<?xml version="1.0"?> <configuration> <system.web> <compilation targetFramework="4.0" /> </system.web> </configuration>
ASP.NET提供了強大的Cache功能,相關的細節可以參考這篇:[ASP.NET]淺談Cache機制
這個Cache功能雖然強大,但卻有個缺點,若大家有印象,應該知道Session的儲存模式分成四種吧,其中的InProc就是將Session的內容放到本機的記憶體中,這種儲放法最大的問題主要在於記憶體的使用量會較高,因此ASP.NET還多提供了SQLServer跟StateServer兩種儲存模式,但這樣的模式在Cache機制中並沒有被提供,直到ASP.NET 4.0中才真正完成實作,我們可以自行實作我們Cache的data要以什麼方式儲存,進行步驟如下:
1.在web.config中定義Provider
<caching> <outputCache defaultProvider="AspNetInternalProvider"> <providers> <add name="DiskCache" type="Test.OutputCacheEx.DiskOutputCacheProvider, DiskCacheProvider"/> </providers> </outputCache> </caching>
2.在Page/Control上設定CacheProvider名稱
<%@ OutputCache Duration="60" VaryByParam="None" providerName="DiskCache" %>
3.或者在程式中指定不同的request要由不同的Cache Provider來處理
public override string GetOutputCacheProviderName(HttpContext context) { if (context.Request.Path.EndsWith("Advanced.aspx")) return "DiskCache"; else return base.GetOutputCacheProviderName(context); }
這個功能其實讓我頗為驚豔,ASP.NET在之前一直有個讓我們頭痛的地方,那就是第一次啟動系統、網頁時需要比較長的時間,之前我還寫過一篇文章,希望能解決這個問題:
但這樣的解法畢竟並非正規解法,一直希望ASP.NET能推出一個完整的解決方案,而Auto-Start這個功能可以幫助我們在站台啟動時預先執行一些處哩,減少第一次使用等候的時間,此功能雖然沒達到治本的需求,但起碼也能治標了,細節的話這邊講的比我清楚,可以參考一下:Application Warm-Up
我們可以透過在applicationHost.config中設定以下內容讓特定的Pool永遠在暖機狀態:
<applicationPools> <add name="MyApplicationPool" startMode="AlwaysRunning" /> </applicationPools>
不過有個很遺憾的點,那就是這個功能竟然只支援以下環境,真是讓人心碎阿:ASP.NET 4 runs on IIS 7.5 on Windows Server 2008 R2
Response.Redirect會造成HTTP 302的狀態碼(temporary redirect),而4.0的RedirectPermanent則提供了HTTP 301(permanent redirect),兩個代碼間的差異可以參考保哥的:
前面有提到,ASP.NET的 Session提供了數種的儲存模式,其中的SQLServer與StateServer是分別將Session放到資料庫與Web farm中,而這兩種儲存方式其實是透過序列化的方式進行資料傳輸,這樣的傳輸最大的缺點就是效率會比InProc慢一些,特別是若在Session中放了太大的資料量時,而4.0針對這樣的提供了Session壓縮的功能,主要是透過System.IO.Compression.GZipStream這個namespace來處理,只要在web.config中設定compressionEnabled即可:
<sessionState mode="SqlServer" sqlConnectionString="data source=dbserver;Initial Catalog=aspnetstate" allowCustomSqlDatabase="true" compressionEnabled="true" />
ASP.NET的網址過去受到NTFS檔案系統的限制,URL的長度最多只能有260位元,QueryString的長度雖與NTFS無關,但也有2048位元的長度限制,相關資訊可以參考保哥的資料:
但在4.0我們可以透過config來修改這個設定,分別透過maxRequestPathLength與maxQueryStringLength屬性:
<httpRuntime maxRequestPathLength="260" maxQueryStringLength="2048" />
除此之外,另一個小功能就是可以設定哪些字元不能出現在URL中,可以減少一些安全性的問題:
<httpRuntime requestPathInvalidChars="<,>,*,%,&,:,\" />
ASP.NET的request validation主要是用來防堵XSS攻擊,然而XSS的攻擊手法非常多光靠ASP.NET內建的機制可能無法全部都檔到,若我們身處的環境比較複雜,我們可以透過自訂request validation logic來達到檢查每個request的效果,我們可以new一個class繼承自System.Web.Util.RequestValidator:
public class CustomRequestValidation : RequestValidator { protected override bool IsValidRequestString( HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex) {...} }
並在web.config中設定:
<httpRuntime requestValidationType="Samples.MyValidator, Samples" />
往後此站台的request都將透過我們撰寫的邏輯進行檢查了。
因為Cache的功能是位於System.Web.dll這個dll中,過去若Winform或者WPF的應用程式想要使用到Cache的功能,就必須要參考System.Web.dll這個dll,在4.0之後,微軟將Cache的功能獨立到另一個dll中-System.Runtime.Caching.dll。
在4.0,我們可以針對以下幾個文字內容進行自定編碼:HTML、URL、HTML attribute、HTTP headers,做法上我們要繼承System.Web.Util.HttpEncoder來時做我們所要的客製的encoding邏輯,並在web.config中設定:
<httpRuntime encoderType="Samples.MyCustomEncoder, Samples" />
如此一來當我們在程式中呼叫System.Web.HttpUtility或System.Web.HttpServerUtility裡頭的public方法時,會自動以我們自定義的encoding邏輯進行編碼。
主要是用在多個站台共用同一個Application Pool的狀況下,系統管理員不容易分辨哪個站台發生了問題(分開Pool不就好了?),而這個功能可以讓我們透過設定去監控Pool的執行狀況,只要在aspnet.config中設定以下內容即可:
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <runtime> <appDomainResourceMonitoring enabled="true"/> </runtime> </configuration>
目前不知道這個功能與以前的Health Monitor有多大差別。
可以在編譯時期指定要編譯的.net版本,只要設定以下屬性,則編譯時會以.net 4.0的編譯器進行編譯:
<compilation targetFramework="4.0"/>
而這個設定有幾個點要特別留意:
1.在4.0的Pool中,預設是以framework 4.0來編譯
2.若web.config中同時包含了system.codeDom定義,在設定時需要額外留意(還沒研究)
3.若我們透過aspnet_compiler進行precompile,則必須要注意Command line中指定的編譯器版本要與targetFramework一致
游舒帆 (gipi) 探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。 |