以 iisreset.exe 與 appcmd.exe 管理 Windows IIS Container
當我們採用含 IIS 功能的 Windows Container 後(例如,Windows IIS、ASP.NET等),有時需要查詢或操作 IIS,未經組態的 IIS 容器並無法直接使用如 IIS 管理員等 GUI 工具來連線管理。還是可以透過內建 iisreset.exe 與 appcmd.exe 來進行查詢與管理。
當我們採用含 IIS 功能的 Windows Container 後(例如,Windows IIS、ASP.NET等),有時需要查詢或操作 IIS,未經組態的 IIS 容器並無法直接使用如 IIS 管理員等 GUI 工具來連線管理。還是可以透過內建 iisreset.exe 與 appcmd.exe 來進行查詢與管理。
前一篇使用GZIP或DEFLATE壓縮,提升資料傳遞效能40倍,我們處理了查詢資料量大時,Web API 在傳遞未經壓縮的資料產生許多不必要的網路流量的問題。現在我們轉換方向,如果是用戶端要傳遞大量資料至 Web API 時,那麼我們要怎麼處理?這比較麻煩,有二個方向要討論,一是 Client 端進行發送請求時,必須先做 GZIP/Deflate 的壓縮,而 Web API 接收到 GZIP/Deflate 壓縮資料後需要解壓縮還原資料內容。
從這個方向來思考,你應該能發現另一件事,就是前一篇我們只專注在 GZIP/Deflate 的壓縮上,並無做任何解壓縮的工作,那是因為瀏覽器本身在協商過程與接收到的 Header 可以判定接收到的是 GZIP/Deflate 的內容,瀏覽器會直接幫我們進行 GZIP/Deflate 的解壓縮工作。
專案有個查詢資料量不小,基本測試資料每次約1.92 MB,透過 ASP.NET Web API 傳遞至 Client 端每次就是 1.92 MB 的網路傳遞量,而且未來上線後,資料量只會越來越大,直覺感到不對勁(壞味道)。
IIS的動態壓縮與靜態壓縮對 ASP.NET Web API 是無效的。而且,平常 ASP.NET Web API 的請求,資料負載量也不是很大,那種 KB 級的資料壓縮率不高,平常也就沒特別注意。不過在 MB 級的資料,有無啟用 GZIP 或 Deflate 壓縮的資料量差異,直接說結果,以我實測得到的數據差了40倍。
我們有個專案的架構如下:
JS Framework <--> ASP.NET MVC <--> ASP.NET Web API(Service) <--> UDSP <--> ASP.NET Web API(Authorzation)
專案網站有個怪問題,如果網站2到3小時的時間無人使用,那麼閒置時間後第一個第一次使用的人會特別慢。針對IIS的Application Pool的啟動模式由OnDemand改為AlwaysRunning,針對IIS站台的預先載入也已經修改為true,但效果有限。相關停頓、反應時間過長等情境在本地端(Local)模擬不出來,由於分層(tier)過多追起來費時費工。
有無什麼好辦法,可以針對發行至IIS的站台進行線上的偵錯?有的,目前我知道的有三種方法:
WinDBG功能強大,但指令參數複雜,而且取得Dump檔的過程不是那麼友善。針對這樣的問題,WinDBG近期有推出一支Microsoft Store App - WinDBG Preview,可以透過GUI來查詢分析Dump檔案。IntelliTrace Collector也是強大,但推廣不易,因為IntelliTrace定位在Visual Studio企業版才能使用。DebugDiagnostic Tool是本篇的主角,選擇它的原因很簡單,第一、它安裝與使用容易。第二、它收集Dump容易。第三、它分析Dump容易。
首先,你必須先下載Debug Diagnostic Tool v2 Update 2並安裝至IIS所在的伺服器上。安裝好會多三套工具,DebugDiag 2 Collection、DebugDiag 2 Analysis、DebugDiag 2 RuleBuilder(beta)。
今天在申請 SSL 憑證被單位告知,使用 IIS 產出的 CSR 採用的 SHA1 演算法已被破解(就找到的新聞來看,是被認為不安全,各大公司有計畫性的淘汰 SHA1,例如:SSL 和程式碼簽章憑證的 SHA-1 雜湊演算法移轉 - 以 SHA-2 憑證取代 SHA-1 憑證、HTTPS網站被Chrome打臉?),需改用 SHA2(SHA256) 重新製作,但找了半天也沒找到 IIS 在建立憑證簽章請求的 GUI 中可以選擇 SHA2 演算法,後來才知道,使用 IIS GUI 來產生的 .csr 憑證檔案預設都是使用 SHA1 演算法。那麼怎麼辦呢?
還好小弟自己每年要為 kkbruce.tw 申請與安裝 SSL,剛好略懂 SSL 的申請與安裝,不然如果直覺下關鍵字「iis sha2 csr」(我還是有下啦),那些方法看完頭都昏了。
使用者回報一個剛上內部測試區的網站嚴重破版,但「在開發者電腦正常,在使用者電腦不正常」,唯一差異,開發者是在本機測試,使用者是連上測試區的 IIS 測試。同事快速從 F12 開發者工具發現關鍵字,借此又多瞭解一個 Microsoft Edge / Internet Explorer 預設值與差異。
自從G大(谷歌)說,我要提升使用HTTPS網站排名之後,慢慢網站的世界有了改變。啟用HTTPS的網站比例不斷升高。例如,kkbruce.tw就啟用了HTTPS。這裡感謝DigiCert提供免費的SSL憑證。
kkbruce.tw是建置在Microsoft Azure之上,而且現在Microsoft Azure上的文件寫的還不錯,新的一年到來,也到了要更新kkbruce.tw的SSL憑證時間,要更新SSL憑證可以參考針對 Azure App Service 中的 App 啟用 HTTPS的內容。在取得SSL憑證,我採用的是使用 Certreq.exe 取得憑證。
如圖,我在第四步碰到些問題:
代誌是這樣的,比較認識我的人就會知道,我在開發Web Application (MVC、Web API)除非需要下中斷點除錯,不然其實我是比較少按【F5、Ctrl+F5或含瀏覽器名稱的綠色三角型】來啟動IISExpress.exe,那要怎麼啟動呢?我喜歡用指令的方式來啟用IISExpress。VS2015新增新網站應用程式專案後發現,怎麼在apcmd list site怎麼樣就是找不到剛新增的專案?但VS2015又能正確啟動新增好的專案呢!
Bundling and Minification 在書中 5.6 小節我翻譯為「合併與最小化」,這是一個對於網站而言非常非常非常實用的功能,它能快速合併你所有設置的所有檔案成為一個檔案(多合一)併進行最小化的工作,重點是完全自動化,不需要再去其他類似JavaScript最小化、CSS最小化的網站,或下載工具利用工具在上線前再自己手動進行類似工作。各位可以參考前端優化的幾篇文章。
當 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 的書籍在教發行時,通常都是以本機為實作環境,本機通常會安裝 Visual Studio 開發工具,在安裝 Visual Studio 開發工具時會一併安裝 Deploy 的工具與環境,所以本機實作比較沒問題。但實作發行至遠端伺服器時,怎麼樣就是不給發行,這是因為除了帳號密碼外,伺服器還需要可被佈署的環境。有了可被佈署的環境,我們就能如書中所教的一樣,將MVC專案順利發行至遠端伺服器。
以下 Windows Server 2008 R2 為實作平台。
要確認是否具備佈署環境依以下清單檢查:
以下資訊均來自 Channel9 目前於北美 TechEd 活動影片,主要記錄 DEV-B314 這一場 Microsoft ASP.NET, Web, and Cloud Tools Preview 的筆記。
以下將 Visual Studio 2013 Preview 相關內容整理如下:
Visual Studio 2013 Preview簡化一開始的新增專案的對話視窗,只區兩大類,進入後也只區分為Empty、Web Forms、MVC、Web API、SPA、Facebook、Mobile。
測試伺服器不在局限於IIS Express,也可以設置為外部伺服器。
當我們修改頁面文字、Layout、CSS等,可快速重整所有已連接至Visual Studio測試頁面的瀏覽器。
在新增專案時即可設置認證組態,目前可結合其他外部Microsoft Live Id、Facebook、Google+、twitter等。
首先,感謝twMVC的邀請,讓我有機會和大家分享ASP.NET Web API此一主題,課程中有提到一些注意事項,有些內容在《ASP.NET MVC 4網站開發美學》沒交代清楚,整理成以下文章,以補充書中內容。