寄送郵件的封包被防火牆檔掉

5/31/2009
記錄一個困擾很久(半年以上),最終由網管人員解決的問題:
應用程式利用 .NET 類別來發送郵件,大多時候沒有問題,可是偶爾使用者會反應沒收到信件。從應用程式的 log 發現 exception 訊息為:遠端伺服器已經中斷連線。

這種偶爾出現(約一兩個月才出現一次)的問題最讓人頭痛,因為開發人員比較不容易抓到問題的真正原因,一開始大都只能用猜的,例如:可能是網路瞬斷所造成。同時,沒有明確的證據,可能也不知道如何請網管人員協助查看是哪一段網路傳輸的部分可能有問題。

由於我對防火牆、路由器等網路設備相關知識不熟悉,郵件伺服器也不在我的管轄範圍,因此只能先以程式設計的角度嘗試找出問題發生的原因。經過反覆的測試,發現同一份 HTML 格式的郵件,如果將內文加入一些 Enter 鍵斷行,原本寄送失敗的信件就可以寄送成功了。我第一次碰到這種情況,實在太詭異了。

此外,同樣的測試郵件內容,在機房裡面的應用程式會寄送失敗,在我的機器上卻能發送成功。由於我的機器與機房裡的機器的主要差別就在防火牆設備,於是將這兩條線索提供給網管人員。

經網管人員查看網路傳輸的 log 和防火牆設定之後,發現是被 CISCO 防火牆設備的 ESMTP 檔掉了。也就是說,當欲發送的 HTML 郵件含有特定 pattern 的字串時,CISCO 防火牆會認為那是不安全的封包而將它檔掉。

以下是網管提供的 log (實際的 IP 位址已改掉):

2009-04-10 14:20:02 Local4.Info 123.45.67.100 %ASA-6-302014: Teardown TCP connection 3734887 for outside:123.45.2.64/25 to inside:123.45.67.152/3913 duration 0:00:00 bytes 1644 Flow closed by inspection
2009-04-10 14:20:02 Local4.Info 123.45.67.100 %ASA-6-106015: Deny TCP (no connection) from 123.45.67.152/3913 to 123.45.2.64/25 flags PSH ACK on interface inside
2009-04-10 14:20:02 Local4.Info 123.45.67.100 %ASA-6-106015: Deny TCP (no connection) from 123.45.67.152/3913 to 123.14.2.64/25 flags PSH ACK on interface inside
2009-04-10 14:20:02 Local4.Info 123.45.67.100 %ASA-6-106015: Deny TCP (no connection) from 123.45.2.64/25 to 123.45.67.152/3913 flags ACK on interface outside

網管把 CISCO 的 ESMTP 功能關閉之後,系統的發信功能就全都正常,再也沒發生同樣的問題了。底下是關閉 ESMTP 選項的操作畫面:


問題雖然獲得解決,但我還是不明白 CISCO 的 ESMTP 為什麼會把正常內容的信件檔下來。似乎該去上一點網路管理方面的課程了..... @_@

Visual Studio 2010 與 .NET Framework 4 Beta 1 開放下載了

5/30/2009

Visual Studio 2010 與 .NET Framework 4 Beta 1 開放下載了。

在下載安裝之前,可以先看看這個教學影片:http://tinyurl.com/vs2010beta1


最糟糕的物件導向分析設計文件

5/28/2009
最近 review 一份有如天書的「物件導向設計文件」,不禁想到《物件導向分析設計與應用》書中有這麼一段:
「最糟糕的物件導向分析設計文件,是將每一個類別各寫成一份文件,然後在每份文件裡面描述該類別的所有方法。這種作法會產生很多沒用的文件,沒人會看、也沒人會信賴這樣的文件,而且它也無法呈現跨越單一類別的重要架構議題,也就是類別與物件之間──尤其是元件之間──的合作情形。比較好的作法是,將這些高階結構用 UML 圖形表現,然後提示開發人員可以到哪裡找到某些重要類別的詳細說明。」 (摘自第七章,p.322)

Visual Studio 單元測試專案要怎麼增加額外的部署檔案

5/11/2009

在開發應用程式時,經常有一些額外的組態檔必須在 build 專案時一併輸出到建置路徑下(即預設的 Bin\Debug 或 Bin\Release),這些檔案只要加入專案,並設定其 Copy to Output Directory 屬性為「Copy if newer」就行。但如果是單元測試專案,就還得做額外的設定。

Visual Studio 2008 每次執行單元測試時都會新建一個目錄來存放執行結果,該目錄是建在 solution 目錄下的 TestResults 資料夾底下,目錄名稱以 [使用者名稱_電腦名稱 年月日 時分秒] 的格式命名。在這些目錄裡面,你可以看到一個名為 Out 的子目錄,而你會發現,那些建置專案時一併輸出的額外檔案並沒有丟到這裡。因此,你的單元測試程式碼如果需要載入這些額外的檔案,執行測試時便會失敗。

解決方法:在 Solution Explorer 視窗中展開 Solution Items,雙擊副檔名為 ".testrunconfig" 的項目(若無此項目就自己加一個 Test Run Configuration)以編輯其內容。接著在開啟的對話窗點左邊的 Deployment,再按 Add File 鈕,把應用程式專案的建置輸出路徑下的額外檔案加進來就行了。參考下圖:

《物件導向分析設計與應用》勘誤

5/04/2009
物件導向分析設計與應用》勘誤
p.58 倒數第三段

原文:我們對階層(hierachy)的定義如下:
更正:我們對階層(hierarchy)的定義如下:

p.110 「實體包含」小節

原文將 aggregation 和 composition 的意思說反了:

A less direct kind of aggregation is also possible, called composition, which is containment by reference....Hence, the lifetimes of these two objects are not so tightly coupled as before: We may create and destroy instances of each class independently.

中文版沒有發現這個問題,將原文照譯為:

有一種沒那麼直接的聚合關係,叫做複合 composition),這是以參考(reference)的方式所形成的包含關係......因此,這兩個物件的生命週期就不像之前那樣緊密了─我們可以個別建立及摧毀其中一方。


更正:aggregation 是比較鬆散的 whole-part 關係,可以個別建立及摧毀其中一方。composition 才是實體包含。

p.228 的圖 5-63 少了說明文字

原文:圖 5-63
更正:圖 5-63:分岔進入複合狀態

p.283 的圖 6-7

原文:詳細的元素語意
更正:詳述元素語意

p.340,圖 8-2

排版問題:「衛星導航系統」這幾個字應該印在方塊內,不應壓在方塊的邊線上。

p.344 最後一段,第二行

原文:案例圖,如圖 8-1 所示
更正:案例圖,如圖 8-6 所示

p.363 圖 8-9

原文:SNS 區的部署
原文:SNS 區的部署

p.531 第一段的倒數第二行

原文:的 sessio bean
更正:的 session bean
技術提供:Blogger.