ASP.NET Web Application Project(WAP)與 Web Site Project(WSP)之間有一段有趣的消長演進:ASP.NET 1.0/1.1時代的ASP.NET網站要先編譯成DLL才能執行,稱之為Web Application Project;ASP.NET 2.0起推出Web Site Project架構,採用Code-Beside,不需事先編譯,Blah.aspx與Blah.aspx.cs一起放上IIS網站就能運行。雖然開發者還是可以選擇用WAP寫網站,但WSP改完存檔就能立刻看結果顯然比較迷人,於是WSP成為較多人的選擇。而到了ASP.NET MVC時代,Controller架構依賴事先編譯,加上WAP同時支援WebForm、MVC、WebAPI,於是WAP再次取代WSP回歸主流。延伸閱讀:Web Site Project vs Web Application ProjectWeb Site Project為何沒落?

近幾年來,新專案都已改用WAP,WebForm、MVC進可攻退可守,網頁執行前都需要編譯,WSP那個「寫兩行程式存檔就能看測試結果」的時代似乎已一去不返… 其實沒有!ASPX即時編譯的功能一直都在,也是本篇要分享的IIS網站除錯小密技。

實務上,不少場合我們還是非常需要ASPX的「隨寫隨測」功能,像是射IIS茶包,開Notepad寫幾行測完,絕對完勝開Visual Studio改程式編成DLL再丟到IIS,快了豈止十倍。舉幾個我自己遇過的例子:

  • 懷疑正式台因appSetting設定值不對出錯,想檢查設定值是否為預期內容
  • 想做個TransactionScope包DbConnetion測試確認分散式交易環境正常
  • 在正式台想知道實際使用的ODP.NET元件版本、DLL路徑
  • 列舉檢查正式主機是否欠缺必要的DbProvider

以上狀況,都要靠寫幾行程式丟上主機執行獲得解答。在測試開發環境還簡單,用Visual Studio寫幾行程式部署到IIS執行便知分曉。若問題發生在正式環境,部署過程會複雜一些,例如:若上版流程已進化到只能透過自動編譯部署,為了查問題測個小東西要簽入版控重上程式,等測完再還原未免荒謬。而從本機另編一顆DLL送上正式機,測完再換回來也沒簡單到哪裡去。

面對類似情境,我會在IIS Web的目錄新増一個test.aspx,用Notepad記事本輸入以下內容:(以檢測DbProvider為例)

<%@ Page Language="C#" %>
<ol>
<%
  System.Data.DataTable dt =
  System.Data.Common.DbProviderFactories.GetFactoryClasses();
  for (int i = 0; i < dt.Rows.Count; i++)
    Response.Write("<li>" + dt.Rows[i][2] + "</li>");
%>
</ol>

薑!薑!薑!薑~

是不是重現了WSP時代那種「隨寫隨測」的敏捷性?而且測完刪除test.aspx就恢復原樣(提醒:記得要將測試程式刪除,以免被誤用產生風險),省去置換DLL還要還原的麻煩,又可以現改現看,輕巧方便許多。

最後再補充兩則小技巧,應該很多人像我一樣,用Notepad少了Intellisense就不會寫程式,所以我會在本機開Visual Studio把程式寫好,再複製貼到遠端桌面環境。另外,在Code-Behind中我們常用using省去打一堆Namespace,在Inline ASPX裡可用<%@ Import Namespace="…" %>宣告產生相同效果,例如:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.Common" %>
<ol>
<%
  DataTable dt = DbProviderFactories.GetFactoryClasses();
  for (int i = 0; i < dt.Rows.Count; i++)
    Response.Write("<li>" + dt.Rows[i][2] + "</li>");
%>
</ol>

雖然沒什麼學問,卻是十分簡單好用的小技巧,下回再遇到正式環境IIS茶包,大家該知道如何在ASP.NET網站現場撰寫測試程式偵錯了吧?


Comments

# by mot

mvc架構的話應該就沒辦法這樣測了?

# by Jeffrey

to mot, 在ASP.NET MVC網站也可用,我一直都靠這招在MVC網站查線上問題,不過若你想測的對象不修改Model或Controller測不出來,的確只能改Code重Build。

Post a comment