提升ASP.NET MVC專案安全性與效能小技巧

ASP.NET MVC專案最佳化

在討論ASP.NET MVC時,大多是針對MVC模式與MVC應用程式在討論,較少看到有人討論ASP.NET MVC專案本身,其實ASP.NET MVC專案有幾個地方可以微調整,有些可以增加安全性,有些可以增加效能。

取消Header輸出MVC專案版本

預設的ASP.NET MVC專案在一次回應請求的標頭裡包含著些ASP.NET MVC專案的版本,以 http://kkbruce.tw 為例,預設情況下的回應標頭(Response Header)為:

HTTP/1.1 200 OK
Cache-Control: public, max-age=3600
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Sat, 27 Jul 2013 17:49:36 GMT
Last-Modified: Sat, 27 Jul 2013 16:49:36 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/8.0
X-AspNetMvc-Version: 4.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RTpcUHJvamVjdHNca2ticnVjZS50d1xra2JydWNlLnR3XEJvb3RzdHJhcFxHZXR0aW5nU3RhcnRlZA==?=
X-Powered-By: ASP.NET
Date: Sat, 27 Jul 2013 16:49:39 GMT
Content-Length: 7699
  

由回應標頭(Response Header)中可以看出目前此網站的ASP.NET MVC 4的專案,如果某個版本ASP.NET MVC專案某一天爆發漏洞,那麼要找下手的目標是很容易的。

所有一個簡單的需求,不管我們的ASP.NET MVC專案是什麼版本,MVC 2/3/4/5…都不要在回應標頭(Response Header)顯示ASP.NET MVC專案版本,其實也很容易,只需要在 Global.asax 的 Application_Start() 透過以下設置:

Web API Client Library+Portable Library打造跨平台的Web API服務類別

Web API Client Library與Portable Library

ASP.NET Web API Client Library(HttpClient)讓我們簡單地在.NET用戶端應用程式中與RESTful HTTP Service互動。之前版本的Web API Client Library對於跨平台的支援度不是那麼好,目前Web API Client Library的下一個預覽版已經在這方面進行改良。此預覽版新增了可攜式類別庫(Portable Library)的支援,目前支援.NET Framework 4.5、Windows Store、Windows Phone 8三種應用程式類別。這些支援建構在最近發佈的可攜式HTTPClient和可攜式類別庫支援Json.NET。這樣我們就能建立單一的可攜式類別庫去讓Windows Store App、Windows Phone去呼叫Web API。

建立不同平台的專案

接下來,我們要建立三個專案,一個可攜式類別庫,透過可攜式類別庫使用Web API Client Library來呼叫RESTful HTTP Service,一個.NET Framework 4.5的主控台應用程式,一個Windows Store App,主控台應用程式與Windows Store App會透過可攜式類別庫來進行服務呼叫。

  1. 新增專案 → 可攜式類別庫專案 → 名稱:ContosoClient
  2. 進行可攜式類別庫條件設定。請設定為.NET Framework 4.5、Windows Phone 8、.NET for Windows Store App
    這是因為ASP.NET Web API Client Library不支援 xbox 360、Silverlight和Windows Phone 7.5。以下範例不進行Windows Phone 8示範,不過我們的建立的可攜式類別庫是可以支援Windows Phone 8。
  3. 加入 → 新增專案 → 主控台應用程式 → 名稱:ContosoConsole
  4. 加入 → 新增專案 → Windows市集 → 空白的應用程式(XAML) → 名稱:ContosoStore
    這裡可能會出現要求取得市集開發者授權請求,請依畫面登入取得。
  5. 透過 NuGet 為三個專案加入Microsoft.AspNet.WebApi.Client的參考。NuGet請選擇包括發行前版本
  6. 為ContosoConsole與ContosoStore專案加入對ContosoClient的參考。

JavaScript - createElement vs createDocumentFragment

答客問

網友 Adam Lee 在 JavaScript - 程式碼壓縮與最佳化 留言指教,說我的測試程式有問題。因為文章撰寫時間有點久了,也忘了當時有沒有進行測試,那我們就來測試看看吧。

createElement與createDocumentFragment的測試程式碼。

網友 Adam Lee 已準備好一個測試程式 http://jsfiddle.net/z3caE/ 大家可以用不同瀏覽器玩玩看分數如何?

以下是我在本機端的測試程式:

MVC 4發行至IIS 7.5之後Bundle功能無法運作

MVC 4 - Bundling and Minification

Bundling and Minification 在書中 5.6 小節我翻譯為「合併與最小化」,這是一個對於網站而言非常非常非常實用的功能,它能快速合併你所有設置的所有檔案成為一個檔案(多合一)併進行最小化的工作,重點是完全自動化,不需要再去其他類似JavaScript最小化、CSS最小化的網站,或下載工具利用工具在上線前再自己手動進行類似工作。各位可以參考前端優化的幾篇文章。

IIS 7.5無法運作Bundle功能?

當 Visual Studio 2012 發行 ASP.NET MVC 4 專案至 Windows Server 2008 R2 x64 平台(IIS 7.5)後發現 Bundle 功能無法運作。利用程式碼 BundleTable.EnableOptimizations = True 進行設置依然無效。

在網路上搜尋了一陣子,找不到什麼有關的資料,絕大部分都是討論 Bundle 的設置或 BundleTable.EnableOptimizations 程式不然就是 web.cofnig 裡 debug="true" 這個參數。

然後又花費無數青春,在一陣發瘋似亂搞亂測之後,找到了問題的根源。

發行ASP.NET MVC 4之前遠端Windows Server 2008 R2的環境準備

可被佈署的伺服器環境

ASP.NET MVC 的書籍在教發行時,通常都是以本機為實作環境,本機通常會安裝 Visual Studio 開發工具,在安裝 Visual Studio 開發工具時會一併安裝 Deploy 的工具與環境,所以本機實作比較沒問題。但實作發行至遠端伺服器時,怎麼樣就是不給發行,這是因為除了帳號密碼外,伺服器還需要可被佈署的環境。有了可被佈署的環境,我們就能如書中所教的一樣,將MVC專案順利發行至遠端伺服器。

Windows Server 2008 R2佈署環境準備

以下 Windows Server 2008 R2 為實作平台。

要確認是否具備佈署環境依以下清單檢查: