1. [BlogEngine.NET] 改造工程 - CS2007 資料匯入

    自從搬到 BlogEngine.NET 之後,每天晚上都沒閒著,一點一點的慢慢把整個網站改成我要的樣子... 資料庫 / 檔案是我最在意的,當然要優先顧好,光這部份就花了一個多禮拜...

    最早找到了 CS2007 --> BlogML --> BlogEngine,大概把我想要的 90% 資料都轉過來了,不過看到那 10% 的資訊沒過來,心裡就很不是滋味...

     

    "這是我要一直保留下來的資料耶,現在沒把資料補回來,以後就永遠補不回來了..."

     

    就是心裡一直這樣想,所以... 重匯吧! 不然以後後悔也是補不回來的。首先當然是想先從 BlogEngine 匯入 BlogML 的工具下手,看了一下,沒提供 Source Code ? 再看一下,一篇文章一個 Web Service Call,一則回應也是一個 Web Service Call ... 感覺起來有點沒效率,不過不管了,我內容也不多 (兩百多篇文章) ... 既然有 Web Services,先看看它的 WSDL ...

     

    image
    http://columns.chicken-house.net/api/blogImporter.asmx

     

    沒幾個 WebMethod 嘛,不過看一看它的 Interface 就已經漏掉很多資訊沒轉進來了 (像是我要的原 CS PostID,事後作新舊網址對照表用,還有 PageViewCount... etc),要改原程式也是個大工程,不但 CLIENT 要改,WEB METHOD 也要擴充... 我又不是非得遠端用 WEB SERVICES 執行匯入不可,就當下決定另外寫一個匯入程式還比較快...。重寫的話就得研究它的寫法,正好每個 WebMethod 都只作單一的動作,裡面的實作就是現成的範例... 省了不少熟悉 API 的時間 :P

     

    事後證明這作法沒錯,BlogEngine 的 LIB 蠻簡單易懂的,另外寫真的比較快... 就一切以原 .ASMX 的程式碼為藍本,寫了一個 .ASHX ,不作什麼事,就是把事先放在 ~/App_Data 下的 BLOGML 讀進來,一篇一篇 POST 處理,一個一個回應處理... 兩層迴圈就搞定原本那 90% 的匯入作業...

     

    接下來就是自訂的部份了。先來列一下那些是我要補的資訊:

    1. 每篇 POST 的 COUNTER
    2. 每則回應的詳細資訊
    3. 每篇 POST 的 ID ( CS2007 內的 ID ),及匯入後的新 ID
    4. 所有必要的網址修正 (圖檔,站內文章連結..)
    5. 原程式的一些缺陷修正 (如前文提到,Modified Date錯誤的問題)

     

    源頭就有東西要補了。如果一切基於 BlogML 的話,BlogML 沒定義到的資料就沒機會撈出來了。看了一下我還需要額外抓出來的資訊,像匿名的 COMMENTS 作者資訊,IP 等... 不過這些都用某種序列化的方式存在 CSDB,ㄨ!! 真麻煩... 在 CS2007 DB 內的 [cs_posts] 有這兩個欄位: PropertyNames, PropertyValues... 沒錯,全部壓成一個大字串,得自己寫程式去 PARSE ...

    CS2007 的作法是這樣,在 PropertyNames 欄位放的值長的像這樣 (包含 Name, 型別, 字串起始及結束位置):

    SubmittedUserName:S:0:3:TitleUrl:S:3:35:

     

    而在 PropertyValues 對應的值為:

    小熊子http://michadel.dyndns.org/netblog/

     

    拆起來有點小麻煩,PropertyNames 是 {Name}:{Type}:{StartPos}:{EndPos}: 的組合,有多組的話就一直重複下去。以 Comments 的 SubmittedUserName 來說,它的型別是 S ( String ),它的值就要從後面的 PropertyValues 整個字串的第 0 個字元 ~ 第 3 個字元之間的值 ( 小熊子 ),而 TitleUrl 則是第 3 個字元 ~ 第 35 個字元的值 ( http://michadel.dyndns.org/netblog/ ) ...

    看來用 T-SQL 拆或是用 XPath / XSLT 拆都有點辛苦,想想算了... 這段 CODE 跑不掉一定要寫... 就硬解出來吧。解出來後就可以修正 CS2007 匿名張貼的 Comment 沒正確顯示在 BlogML 內的問題。

    接下來要把 SQL 這堆資料倒成 XML 檔,偷吃步一下,找工具直接倒出來就好。反正只作一次,可以不要寫 CODE 就不要寫了... SQL2005 要把 QUERY 結果存成 XML 倒是很簡單,打開 SQL2005 Management Studio, 執行這段 QUERY:

    取得所有 comments 的額外 PropertyValues 的查詢指令[copy code]
       1:  select 
       2:    PostID, 
       3:    PostAuthor, 
       4:    PropertyNames, 
       5:    PropertyValues 
       6:  from cs_posts 
       7:  where ApplicationPostType = 4 
       8:  for xml auto


     

    會看到這樣的畫面:

    image

     

    點下去就是 XML 了,手到加上頭尾的 Root Element 存檔就搞定了。接下來補段 CODE 把我要的 Property 拆出來存 XML 檔,第一步驟收工!

    接下來這堆問題就以 (4) 最麻煩了。原本想的很天真,用文字編輯器把所有 XML 檔替換掉就沒事... 錯! 先從最單純的圖檔路逕來看吧..

     

    [替換圖檔及下載檔案的網址]

    最基本的就是圖檔網址... 在 CS2007 裡圖檔是這樣放的 (WLW會幫你補上絕對路逕,不是用相對路逕)

    http://columns.chicken-house.net/blogs/chicken/xxxxxxx/xxx.jpg

    而看了 BlogEngine 的作法,它用 HttpHandler 的方式來提供前端下載圖檔,格式像這樣:

    http://columns.chicken-house.net/xxxxx/wp-content/be-files/xxx.jpg

    而 BlogEngine 的設定檔是這樣寫的:

     

    BlogEngine 在 Web.config 內的 HttpHandler 區段[copy code]
       1:  <httpHandlers>
       2:    <add  verb="*" 
       3:      path="file.axd" 
       4:      type="BlogEngine.Core.Web.HttpHandlers.FileHandler, BlogEngine.Core" 
       5:      validate="false"/>
       6:    <add  verb="*" 
       7:      path="image.axd" 
       8:      type="BlogEngine.Core.Web.HttpHandlers.ImageHandler, 
       9:      BlogEngine.Core" 
      10:      validate="false"/>
      11:    .....
      12:  </httpHandlers>

     

    看起來不難,理論上我只要找到原網址,把 ~/blog/chicken/ 後的路逕切出來,前段改成 image.axd?picthre= 就可以了。

    大致上是這樣沒錯,不過變數還不少... 因為有好幾種網址 @_@

    1. 分家前  ( http://community.chicken-house.net/blogs/chicken/xxxxx )
    2. 分家後  ( http://columns.chicken-house.net/blogs/chicken/xxxxx )
    3. 古早時代手工打的 ( /blogs/chicken/xxxxx )
    4. 有些內建的要避開,像 ( http://columns.chicken-house.net/blogs/chicken/rss.aspx )

    代換要嘛一次做完,要嘛一定要照 1 2 3 順序,否則先做 (3) 就會把 (1) (2) 都破壞掉了... 但是怎麼想程式都很不乾脆,雜七雜八的 CODE 一堆... 最後搬出  http://regexlib.com/ 這個網站,它提供大量的 Regular Expression 的資料庫供你使用,也提供了線上版本讓你測試 MATCH 的結果,很好用! 一定要推一下...

    最後定案的 Regular Expression 長這樣:

    (http\://(columns|community)\.chicken\-house\.net)?/blogs/chicken/([a-zA-Z0-9\-_\./%]*)

    一切都很順利,簡單的就精確的抓到要代換的範圍。補一下小插曲,最後轉完才發現漏掉 (4),不過沒幾篇,就手動改掉了 :P,所以這段 REGEXP 是沒處理到 (4) 這種情況的...

     

     

    [站內連結的修正]

    再來就開始麻煩了... 動手前我先想了一下,每篇文章要匯進去後才會知道它的新 ID,新網址... 在還不知道新網址之前有些內容的聯結就無法替換了,怎麼樣都不可能在 1 PASS 內解決這問題... 只能用 2 PASS 來處理了。

    既然這樣,第一次匯入就不修站內聯結了,只要把新舊 ID 記下來就好...

    頭痛的來了,CS2007 的網址格式有好幾種 @_@ (難怪它有專門一個 config 檔來設定幾十個 URL Rewrite 的設定...):

    1. /blogs/chicken/archive/2008/06/20/1234.aspx
    2. /blogs/chicken/archive/2008/06/20/MyPostTitleHash.aspx
    3. /blogs/1234.aspx

    其中 1234 是 CS2007 內部使用的 PostID .  再看看 BlogEngine 的網址格式:

    1. /post.aspx?id=xxxx-xxxx-xxxxxx-xxxxxxxxxxx
    2. /post/xxxxxxxxxxxxxxxx.aspx (某種 TITLE 的 HASH,它稱作 SLUG)

    還好 BlogEngine 單純多了,只要抓到 (1) 的 ID,SLUG 就有 API 抓的到...

    記得 CS 網址還有不需要 URL Rewrite 的版本 ( /blogs/xxxxx.aspx?postID=1234 這樣),不過從來沒出現在我文章內容,就不理它了...

    這裡的重點不是單純的代換了,還要精確的抓出 1234 這段 PostID .. 最後定案的 Regular Expression 長這樣:

    (http\://(columns|community)\.chicken\-house\.net)?/blogs/chicken/archive/\d+/\d+/\d+/(\d+)\.aspx

    果然人家說 Regular Expression 是 "WRITE ONLY LANGUAGE" 真有道理,寫完連我自己都看不懂這堆符號是在幹嘛... 最後新舊 ID 都抓到就可以產生出正確的新站內連結了..

     

     

    [站外連結修正]

    我自己的 LINK 找到就可以修,不過寫在別人那邊的我那修的到啊... 因此就要靠上一篇講的,想辦法要去接有人點到舊的 CS LINK,然後當場做轉址的動作...

    好在舊的文章不會再變多了,靠前面做出來的對照表就有足夠的資訊了... 成果看上一篇就知道了。這裡主要是靠 CSUrlMap.cs 這個我自己寫的 HttpHandler 來解決所有連到 /blogs/*.aspx 的連結...

    方法差不多,我得從各種可能的網址格式,抓出舊的 CS PostID,然後查表,找出新的網址,把使用者引導到新的頁面... 貼一下主程式的部份:

    CSUrlMap, 將 CS2007 的網址重新導向到 BlogEngine 網址的 HttpHandler[copy code]
       1:  public void ProcessRequest(HttpContext context)
       2:  {
       3:      if (matchRss.IsMatch(context.Request.Path) == true)
       4:      {
       5:          //  redir to RSS
       6:          context.Response.ContentType = "text/xml";
       7:          context.Response.TransmitFile("~/blogs/rss.xml");
       8:      }
       9:      else if (matchPostID.IsMatch(context.Request.Path) == true)
      10:      {
      11:          //  redir to post URL
      12:          Match result = matchPostID.Match(context.Request.Path);
      13:          if (result != null && result.Groups.Count > 0)
      14:          {
      15:              string csPostID = result.Groups[result.Groups.Count - 1].Value;
      16:              if (this.MAP.postIDs.ContainsKey(csPostID) == true)
      17:              {
      18:                  context.Items["postID"] = this.MAP.postIDs[csPostID];
      19:                  context.Items["redirDesc"] = "網站系統更新,原文章已經搬移到新的網址。";
      20:              }
      21:              else
      22:              {
      23:                  context.Items["redirDesc"] = "查無此文章代碼,文章不存在或是已被刪除。將返回網站首頁。";
      24:              }
      25:          }
      26:          else
      27:          {
      28:              context.Items["redirDesc"] = "4444";
      29:          }
      30:      }
      31:      else if (matchPostURL.IsMatch(context.Request.Path) == true)
      32:      {
      33:          context.Items["postID"] = this.MAP.postURLs[context.Request.Path];
      34:          context.Items["redirDesc"] = "網站系統更新,原文章已經搬移到新的網址。";
      35:      }
      36:      else
      37:      {
      38:          context.Items["redirDesc"] = "查無此頁。將返回網站首頁。";
      39:      }
      40:      context.Server.Transfer("~/blogs/AutoRedirFromCsUrl.aspx");
      41:  }

     

    看程式說故事,大家都會吧 :D,結果就是上一篇各位看到的樣子... 已經沒力一行一行再說明下去了 :P

     

    寫到這邊真是大工程 @_@,動作都不困難,但是都是雜七雜八的工作,害我搞了一個禮拜... 不過到此為止搬家要處理的資料部份全部都完成了。下一篇就輕鬆多了,把網站的版面調整成我想要的樣式... 有興趣的人請多等一等吧 :D 主題會放在跟 FunP 推推王的密切整合上... 敬請期待 :D

    2008/06/21 .NET ASP.NET BlogEngine.NET Community Server 技術隨筆 有的沒的

  2. 換訂閱的網址了!

    原本是把舊的訂閱網址都自動轉過來了, 不過想想這不是好方法, 舊的網址得一直掛在那邊.. 沒換的人一年後還是不會換, 因此還是提醒一下.

    1. FeedBufner (http://feeds.feedburner.com/andrewwu):
      如果你原本是用 feed burner 的網址在訂閱, 可以繼續延用. 不過美中不足的是文章內的 link 有些是相對路逕, 運氣不好會掉圖.
    2. 原有 community server 的訂閱網址 (http://columns.chicken-house.net/blogs/chicken/rss.aspx):
      沒啥好說, 改吧! 改成 (1) or (3) 都可以. 真的撐著不想改也可以, 舊網址只會一直看到這一篇題醒你要換訂閱網址...
    3. 新網址 (http://columns.chicken-house.net/syndication.axd)
      以後文章訂閱的來源就是這裡了... 也可以點網站上方的 [訂閱] 功能...

    大概就是這樣, 請大家繼續支持, 換到新網站, 繼續訂閱吧 :D

    2008/06/19 技術隨筆 有的沒的

  3. 從 CommunityServer 2007 到 BlogEngine.NET

    哈,不是我要搬家了,是網站搬家... 搬家是想了很久沒錯,只是決定搬到 BlogEngine.Net 倒是沒花幾天的時間,所以準備動作也是有點 LiLiLaLa .. 從 CommunityServer 這種成熟的系統搬到還很年輕的 BlogEngine.Net,其實碰到不少小麻煩,在這裡記錄一下給需要的人參考,也算功德一件!

     

    要搬 BLOG,最直覺的就是用 BlogML 了,不錯,我用的 CommunityServer2007 有工具可以匯出 BlogML,而 BlogEngine.Net 也有工具可以匯入 BlogML,想想真是太好了... 就先用 DevWeb 架了 BlogEngine.Net 起來試搬看看..

     

     

    image

    BlogEngine.Net 匯入的方式,是用 ClickOnce,直接從它的官方網站下載的 WinForm App 配合 BlogEngine.Net 本身提供的 Web Service 來進行匯入 BlogML 的動作,除了 BLOGML 之外也支援 RSS? 不過 RSS 怎麼試都試不出來,放棄... 直接用 BlogML ...

     

    image

    畫面很乾淨,它也很忠實的完成了它的工作... CommunityServer2007 的 BLOGML 匯入時出了點問題,文章的修改時間不知為何,BlogEngine.Net 都一直抓到 0000/01/01 00:00:00.000 ,而BlogEngine.Net 還會幫你修正時區的問題 (台灣時區,要 -8 小時才是標準時間),結果一扣就變成負的,就送我一個 Exception ... Orz

     

    匯入的第一步就得動用到 Visual Studio 2008,真不是好兆頭... 所性拿掉那行程式,就一切沒問題了,順利匯入! 架了台測試網站,研究了一兩天,實在是有點不滿意...

    1. LINK 不對
      Windows Live Writer 很好心的幫你把上傳的圖檔都用絕對網址來表示,因此所有的圖都連回原本的網站,正常顯示沒有問題。不過搬家那有這樣搬的... 改!!!
    2. 只搬了BLOG,文章沒有搬
      只怪當時年輕,無聊去用 article 的功能,造成部份是 BLOG 文章,部份是 ARTICLE。CommunityServer2007是都有忠實的匯到 BLOGML,不過 BlogEngine.Net 的匯入工具略過它了... 改!!!
    3. 站內 LINK 不對
      圖檔 LINK 還好修,字串換一換就搞定,不過站内的文章戶連才是個問題... 改!!!
    4. 站外 LINK 不對
      其實這一點是搬完家才發現的,剛搬好 PAGE VIEW 低的可憐... 看一看 LOG 都是 404 Page Not Found ... 改!!!
    5. 沒有 COUNTER
      BlogEngine.Net 說實在話,以BLOG來說功能一點都不缺,不過很怪,竟然沒有最基本的 VIEW COUNT ? 所幸 BlogEngine.Net 有定好 Extension 的架構,要寫它的擴充程式很簡單,有個高手寫了 BlogEngine.Net 的 View Count Extension... 畫面不怎麼樣,不過很實用... 裝!!!
    6. 原有的 VIEW COUNT 沒匯入
      廢話,BlogEngine.Net 本來就沒內建 VIEW COUNT,那是我自己裝了擴充程式才有... 資料要匯,當然也只能自己想辦法 :~~ 改!!!
    7. 版面問題
      標準的版面我很喜歡,就是我要的那種素素的 STYLE,很標準的 ASP.NET Master / UserControl 架構,太棒了... 我要求的也不多,就放放廣告 (看廣告收益很有意思耶,好像電動裡打怪會賺錢或是經驗值那樣... 真的賺多少其實也不重要 :D),還有幾個我自己寫的 CONTROL ... 改!!!
    8. 我在CommunityServer加的功能
      沒辦法,自作孽,改了一堆只能自己搬... 有好幾個:
      • Google Ads (可以用)
      • FunP 推推王 (沒在用了)
      • Recent Comments (已經有內建,可以扔了)
      • 皮哥芸妹年齡 (跟太座的網站分家了,我這邊就不需要了)
      • Bot Check (還沒搞定要怎麼改 :~)
      • Code Formatter 在 BLOG SERVER 要配合的部份

     

     

    上面這幾點,都是搬家時或多或少會碰到的小問題,不過很想哭的是,這六個最後都是搬出 Visual Studio 2008 出來才搞定的 @_@,什麼意思? 就是自己寫 CODE 來修啦... 真不知道該誇還是該罵,也因為這樣有機會 Trace 幾次它的 Code,忍不住想再誇它一次,要建起開發環境實在太容易了 [H] 哈哈...  它的 CODE 很精實,CODE 不多,架構很好,規規舉舉的很容易懂,這種 CODE 改起來真舒服.. (為什麼公司的 CODE 都沒有像這種的...),修改的難度大概只有 CommunityServer 的 1/3 .. (CommunityServer的作者很猛,把 Microsoft 在 2.0 才推出的那套架構在 1.1 時代就都實做了一套 [Y])

     

    現在還有空在這裡慢慢打,當然是這些問題都解決完了,先看看成果吧,細節有空再補 HOWTO 文章。那些 LINK 不對的問題,各位翻翻舊文章,如果都看的到圖點的到東西,就是沒問題了。有問題的請再留話給我,我來修看看。

     

     

    image

    來看看加上 Google Ads 的版面,老實說這個版跟 Google Ads 還真搭... 看起來就像同一套的.. 我只調了 CSS ,跟 MASTER PAGE..

     

    image

    再來是站內文章互連的 LINK。這邊讓我傷了幾秒鐘的腦筋... 就放棄原本只想寫寫批次檔代換的念頭了。轉檔前跟本不知道轉檔後的新 LINK 是長什麼樣子,轉檔後就錯失先改好 BLOGML 再匯入的機會了... 想了一下,無解,一定要動用到 2 PASS 才行... 就乖乖的改轉檔程式了。第一輪就是基本的匯入,然後在原本的 BLOGML 附記新的 LINK 及 BlogEngine.Net 的 PostID,然後 PASS 2 再把舊文章逐一翻出來 SEARCH & REPLACE ... 上圖可以看到,內文 [四核 CPU] 的 LINK (在底下) 就已經是修正過的了,各位可以去試看看...

     

    再來是站外的 LINK,站內我自己的可以改,站外可沒辦法... 拿最捧我場的 Darkthread 網站為例,搜尋一下就有七八篇是連到我這邊,怎麼可以辜負大人的好意... 動搖國本也要改! 現在我的 BlogEngine.Net 已經可以接受舊系統的網址了,而且會正確的轉到同一篇文章的新網址。不過為了不讓大家 "不知不覺" 就轉過來,我特地加了一頁提示,因為書上教的,不要把錯誤隱藏起來 :D,你可以用防禦性的方式寫 CODE,但是務必加上 ASSERT 及 TRACE 提醒自己這裡要注意... (出自一本古董書: Writing Solid Code... 太古董了實在找不到 LINK ... )

     

     

    image 

    就挑這篇來示範吧,黑暗大哥的文章裡有個 LINK,存的是舊的 CommunityServer 格式 URL,點下去之後會跳到我的網站...

     

     

    image

    倒數完或是你沒耐性直接按下去的話,就會跳到這篇文章... BINGO,原本的內容出現了!

     

     

    image

     

     

    嗯,總算修正回來了。其實修正網址是搬家最頭痛的問題了,這個搞定其它都好說 :D  留給有興趣想從 CommunityServer 搬家到 BlogEngine.Net 的人參考...

    (小熊子別再撐了... 還有那個誰也是一樣...)

    2008/06/19 .NET BlogEngine.NET Community Server 有的沒的

  4. FF3 Download Day...

    哈,不是指 Final Fantasy 3 ... 是指 Firefox 3, 今天是 Firefox 3 下載日,看看能不能創下單日內最高的下載次數世界紀錄... 我其實都用 IE 用慣了,也不趕著一定要今天下載,不過既然有世界紀錄,當然要來湊個熱鬧... :D

    貼張照片紀念一下,以後可以跟小皮說 "這個世界紀錄你老爸也有算一份..."

     

    image

    2008/06/18 有的沒的

  5. 換到 BlogEngine.Net 了!

    也許有人只是覺的換版面而以... 原本是打算升級到 CommunityServer 2008 的,不過自從 Community Server 商業化之後,個人版限制越來越多,整套系統也越來越大,常常出了一些問題都沒辦法自己解決 (連 Error Message 都藏的很隱密 -_-)...

     

    其實上面這些也不算缺點,不然我也不會一路從 .Text 時代就用到現在,一用就用了四年多... 上禮拜無意間聽同時講到 BlogEngine.Net,一時好奇抓下來看看,馬上就被它的簡易安裝嚇到了.. 有多簡單? 步驟如下:

    1. 下載
    2. 解開
    3. 設定 IIS 虛擬目錄 / 用 DEV WEB 執行它
    4. 完成了

    我已經很努力的把它寫複雜一點了... 它安裝就是這麼簡單,因為它可以不需要 DB (用一堆 XML 檔取代),因此一行 web.config 都不用改就可以用了... 驚喜之餘,也吸引我更深入的多試了幾個功能...

     

    基本功能試過一次之後,發現它比 CS 還符合我的須要,怎麼說?

    1. 很簡單
      不只是設定簡單,它的功能也很專一,就是一套BLOG而以。沒有複雜的會員機制,也沒有帳號申請,也沒有多套BLOG管理 (不過它支援多個作者),除了 BLOG 也沒有其它功能... 不多不少,正好我要的都有!
    2. Open Source
      雖然 CS 也有 Source Code 可以看,不過它的原始碼越來越難找了... 每次逛它的網站都要找半天才找的到 SDK 在那裡下載...
    3. 不需要 DB
      雖然我自己 HOSTING 我的網站,DB並不是什麼大問題。不過不需要 DB 對我也是個大利多。一方面網站備份更容易,另一方面除錯及改程式也更容易... 更好用的是,未來我可以把整個網站目錄燒到 DVD 上 (不過兩百多篇文章,不到100MB,燒什麼 DVD...),只要再搭配 .NET 附的 DevWebServer,做個 AutoRun ... 想到可以幹嘛了嗎? 我的 BLOG 馬上就變成一份可以放在 CD,需要時就可以就地用 BROWSER 來看內容了!
    4. CODE 精簡,程式碼架構佳
      這點又免不了跟 CS 拿來比較一下... CS 的作者也是高手,CODE寫的很漂亮,不過跟 BE 最大的差別是,CS實在太肥了。肥到什麼功能都要繞個兩三圈... 要修改雖然不難,但是都要花點時間...
    5. 免費! 免費!
      心理作用,其實賣錢的 CS 送的免費版本,功能比完整的 BlogEngine.NET 還多... 不過商業化之後難免會有些功能得付費才能使用... Orz
    6. 小巧,易用,速度快
      CS 即使是在 LOCAL 執行,速度都沒辦法讓人覺的 "飛快",但是換了 BlogEngine.Net 就有這種感覺... 我目前的文章只有兩百多篇,不靠 DB 的速度都還很快。我試過灌了1000篇文章,速度依然很快... 我想這樣就夠了,我要寫到破千篇,不知道還要多久?

    光是這幾個優點,就讓我決定試用只有一天的 BlogEngine.NET 換掉用了四年的 CS ... 剩下的問題只有 "怎麼轉" ? 各位看到現在都成功搬過來,那一定是搞定了... 哈哈... 沒錯,周末花了兩個晚上研究 + 寫匯入程式,今天就重新開張了 :D

    轉檔的過程,改天再寫另一篇,有興趣的朋友請耐心等待續集...

    2008/06/17 .NET BlogEngine.NET Community Server 技術隨筆