優化方案
1.安裝Application Initialization
這是在iis8出來后才有的,iis8內置的功能,而對於iis7.5也提供了一個擴展以支持這個功能。
Application Initialization Module for IIS 7.5
在頁面接近底部的地方,找到適合自己架構的安裝鏈接
- x86 for Windows 7
- x64 for Windows 7 or Windows Server 2008 R2
安裝這個iis模塊后,在iis界面中並沒有模塊圖標和配置界面,還需要安裝:
http://pan.baidu.com/s/1c091WxM
安裝成功之后會多了一個配置如下圖:
如果僅配置程序池StartMode為AlwaysRunning還不放心的話,
也可以同時針對站點開啟preload和DoAppInitAfterRestart。
設置應用程序池如下圖:

設置網站如下圖

配置好后,測試了下,效果十分不錯。
回收程序池后首次打開各站點,延遲都很低。
其實這個模塊的思路和定時從外部觸發一個訪問是一樣的,只是,更好的地方在於,它本身在程序池回收重啟的時候就完成了這件事,而不會讓外部訪問有機會遇到首次訪問的情況。
2.用Ngen安裝生成EF的本地鏡像
由於C#是使用實時 (JIT) 編譯器編譯原始程序集。因此第一次運行C#程序(或Dll)時,程序的啟動非常慢。為了提高用戶的體驗,可以用Microsoft的供的本機映像生成器 (Ngen.exe) 提高程序的性能。Ngen.exe 創建本機映像(包含經編譯的特定於處理器的機器代碼的文件),並將它們安裝到本地計算機上的本機映像緩存中。運行庫可從緩存中使用本機映像,而不是使用實時 (JIT) 編譯器編譯原始程序集。
1)在命令行中定位到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727。因為Ngen.exe存放在這里,如果不定位,Ngen.exe無法正確定執行。
cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
2)生成本機本機映像。
ngen install D:\SystemTool\ManagerNote.dll (備注:Dll方式)
ngen install D:\SystemTool\ManagerNote.exe (備注:exe方式)
3)卸載本機本機映像,請使用與安裝時相同的命令行選項。
ngen uninstall D:\SystemTool\ManagerNote.dll
注意:這里根據你自己機器(是32還是64)和.net版本,選擇相應的命令,只需要安裝EntityFramework.SqlServer.dll,因為安依賴EntityFramework.dll,會自動安裝生成EntityFramework.dll的本地鏡像。
3.EF Pre-Generated Mapping Views(預生成映射視圖)
using (var dbcontext = new EFDbContext()) { var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext; var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace); mappingCollection.GenerateViews(new List<EdmSchemaError>()); //對程序中定義的所有DbContext逐一進行這個操作 }
4.補充
如果你覺得這還沒有解決”過了一段時間不訪問頁面然后再次打開頁面變慢“的問題,而且不能忍受第一次訪問還是有點慢,可以設置應用程序池的”閑時超時“和回收”固定時間間隔“長一些或者建一個計划任務定時去訪問使用了ef的頁面,這樣給ef熱身,讓ef不變冷,這樣可以防止長時間不請求網站,應用程序進程停止再次訪問變慢的問題。設置應用程序池的時間如下圖:

閑時超時默認是20分鍾,如果在超過20分鍾都沒有請求這個應用程序池工作進程就要關閉。這里你可以設置根據自己需要設置長一些。

