2010年5月12日 星期三

Team Foundation Server 2010 安裝成功了

弄了好多天,終於成功了。

繼上次TFS2008安裝的慘痛經驗後,不敢再裝TFS2008了。

在這次的TFS2010,微軟大幅地戶善了安裝過程。在 Single Server的組態上,真的是傻瓜就可以安裝了。一直按 Next, 就可以安裝完成。

然而,我們公司的設定卻必須是 SharePoint Server 2007 + TFS 2010,這也是我痛苦的開始。

文件一堆,但一定要從微軟網站上下載最新的安裝說明。這一點很重要,不要使用光碟上的安裝說明哦!在寫這篇文章時,最新的安裝說明是2010/4/9號.

當然,根據我的需要,就選了Installing Team Foundation Server on Multiple Servers Using Existing Infrastructure 的安裝方式。天啊,要看的文件一堆!連 MOSS 2007 的設定都不太了解了說,又有一堆的文件要看。

最後,以試誤法的方式來安裝,當然晚景淒涼。下次,還是要將文件看清楚再說。(記得上次的安裝經驗談也是這樣說…)

安裝過程首先失敗的是在設定,是在TFS2010 AP Teir 設定SharePoint Web Application 時,發生了下面的錯誤。

TF255329: The following site could not be accessed: http://moss/. The server that you specified did not return the expected response. Either you have not installed the Team Foundation Server Extensions for SharePoint Products on this server, or a firewall is blocking access to the specified site or the SharePoint Central Administration site. For more information, see the Microsoft Web site (http://go.microsoft.com/fwlink/?LinkId=161206).

這個錯誤困住了我好久。最後,還是在安裝文件中找到了原因。一來,TFSService 這個帳號必須設定為 log on as a service。另一個,則這 MOSS 的 Web Application 必須設定為 NTLM 驗證方式。前一個的確我沒作,後一個設定則不知道是誰改掉的。我以為不會有人改動這個設定而沒有檢查。

記住,一定要照文件中一步步的檢查及設定,否則走怨枉路。

另一個則在測試建立 Team Project 時,是OK的,但在顯示 Project Portal 時,在網頁上發生了錯誤:

Cannot make a cache safe URL for "styles/EWRDefault.css", file not found. Please verify that the file exists under the layouts directory

這個發生的原因,是我安裝的TFS2010版本是英文版,會安裝在 C:\Program Files\Common Files\microsoft shared\Web Server Extensions\12\TEMPLATE\LAYOUTS\1028\STYLES下。而 MOSS 2007 是中文版,故使用者的頁面會瀏覽到 1033\STYLES\ 下。解決的法方法,就將 1028\STYLES\EWRDefault.css 複製一份到 1033\STYLES\ 下。

上以就是我的安裝過程了。

IQueryable 的資料,如何在 GridView 的RowDataBound 事件中處理

問題

有讀者問到,以往在 GridView 的資料,常用的是 Datatable 來繫結。如下

GridView1.DataSource = myDataTable;
GridView1.DataBind();

而在 GridView的 RowDataBound 事件中,就可以使用 DataRow 來處理 RowDataBound 細節。如下

if (e.Row.RowType == DataControlRowType.DataRow)
{
    DataRow row = e.Row.DataItem as DataRow;
    string name = row["Name"].ToString();
    ...
}

在使用了 LINQ to SQL 或 Entity Framework 後,就不鼓勵使用 DataSet or DataTable 等資料物件,而是 Entity 了。但這樣一來,繫結到 Anonymous type 的物件,在RowDataBound 的事件要如何指定型別呢?如下例

if (e.Row.RowType == DataControlRowType.DataRow)
{
    DataRow row = e.Row.DataItem as WHAT_TYPE; //不知道要指定什麼型別
    string name = row["Name"].ToString();
    ...
}

解答

Anonymous Type 同一個 Method 中還可以看的到型別,在其他 Method 中,就沒有型別名稱可以使用了,這也是Anonymous Type 特殊的地方。因此,上面的問題中的 WHAT_TYPE 是找不到名稱的。

但我們的目的是找到繫結資料的內容,而非型別。因此使用 Reflection 來找資料內容即可。藉由 DataBinder.Eval 的幫助,我們可以輕易的得到資料內容。如下例

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    string name = DataBinder.Eval(e.Row.DataItem, "Name") as string;
    int id = (int)DataBinder.Eval(e.Row.DataItem, "Id");
    if (id % 2 == 0)
      e.Row.Cells[1].Text = string.Format("{0} is even", name);
  }
}
範例程式可在這裡下載

在 MOSS 2007 上安裝 TFS 2010 的 Extension for SharePoint Products 後,會出現 403 的錯誤

在 Team Foundation Server 2010 發佈後,迫不及待地想要試試新的功能。

在 MOSS 2007 上安裝 TFS 2010 的 Extension for SharePoint Products 後,有些 WebPart 的按鍵上,原本可執行下載檔案的功能,競會出現 403 的錯誤。

同事還以為被攻擊了。心想,哪來這麼多攻擊呢?查一下 wss\80 下的 web.config已被修改過了。與上次的內容相比,多了一些 TFS 在使用的設定。例如 在 httpModules 就多了這個 module

<add name="TSWASPModule" type="Microsoft.TeamFoundation.SharePoint.WebAccess.TSWASPModule, Microsoft.TeamFoundation.SharePoint.WebAccess, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
心想是不是這些設定搞的鬼。試著註釋掉這些設定,仍然不見效果。

特殊的是,管理員仍然可以下載檔案,而一般的使用者不行?細想一下,是不是檔案的安全性出了問題呢?查了一下,果然是。

安裝 Extension for SharePoint Products 後,該安裝程式試著將 c:\inetpub\wwwroot\wss 下的目錄還原到原本的設定,我之前所作的設定就不見了。因此下載失敗。

將 domain\everyone 加回到 wss 的目錄下並授與讀取和執行、列出資料夾內容、讀取的權限後,WebPart 的下載檔案就又回原如初了。

image

2010年5月7日 星期五

SA 被停用了,怎麼辦?

今天早上發現了我的 sql server 2008 的 sa 帳號被停用了。why?

原來 sql server 2008 的 預設policy, 如果一段時間內沒有改密碼,是會被停用帳號的,連 sa 本身也不例外。

正巧,安裝 SQL Server 2008 時,未將安裝時的管理員加入 sysadmins,因此沒有任何帳號可管理 SQL Server 了。

怎麼辦呢?找到一篇詳細的文件,如下,好用。

http://sharedderrick.blogspot.com/2009/11/sa-windows-administrator-sql-serveri.html忘記 sa 密碼,也無法使用 Windows 認證的 Administrator 帳戶來登入 SQL Server。I forgot my SA password and cannot login as administrator using windows authentication.

TFS Reports 未更新

今早要檢視 TFS 的 Quality Indicators 報表時,發現報表一直停留在一個星期之前的資料。詳細看了一下內容,發現訊息是

Quality Indicators

Report Generated: 2010/5/7 上午 09:14:58 by domain\Account; Last Warehouse Update: 2010/4/29 下午 03:16:25

怎麼會這樣呢?看來不知什麼原因,Data warehouse 無法更新了。下午就要簡報,來不及找出原因。要如何手動地先更新一下 Warehouse 呢?

拜請的 G 牌的大神,找到了手動的方法。到 application tier那一台伺服器

  1. 以瀏覽器執行 http://localhost:8080/Warehouse/v1.0/warehousecontroller.asmx,點擊選 GetWarehouseStatus 的連結,並點擊Invoke鍵,確定Warehouse 的狀態是 Idle 的狀態。
  2. 執行 Run 的功能,(也要Invoke),就開始手動更新了。
  3. 以第1步看過程。過程中可能會出現其他的狀態。一直到 Idle 後才完成更新的療程。
  4. 瀏覽 http://localhost/Reports ,查詢到指定專案的報表。此時應該發現報表已經更新了。

目前還不知道是什麼原因造成自動更新Warehouse失敗。

2010年5月5日 星期三

開發 asp.net webform 與 asp.net mvc 不同處

開發流程

asp.net web form 開發功能時,是以網頁(Page)為重心。舉例來說,實作「新增訂單」功能時,

  1. 會想在 web application 下新增一個 Order 目錄
  2. 在Order 目錄下新增一個 AddOrder.aspx 網頁。
  3. 在 designer 上拉 UI Control,例如 GridView
  4. 將 GridView 連接到 datasource,例如設定到 datasource control。

而 asp.net mvc 在開發相同功能時,卻走下面的流程

  1. 思考Url 如何配置:例如 /Order/Create。
  2. 對應到哪一個 Controller:與上一步相關,此時會對應到 OrderController
  3. 在 OrderController 實作 Create 的 Action
  4. 在該 Action 中,取得適當的 Model (即顯示的資料)
  5. 在Action 挑選一個適當的 View,並傳遞Model(資料)到View
  6. 實作該 View

重心

由上述流程觀之,兩者開發的重心大大不同。asp.net web form 重點在網頁,而 asp.net mvc 則在 Controller。asp.net web form 會讓開發人員急著開發功能,而在designer 上設定視覺控件並連接上資料元件。asp.net mvc 開發流程卻會讓開發人員一步步地思考責任分工,最後才實作 View。

由設計流程上, asp.net mvc 的確較優,這也是為何微軟在2008到現在,花了較多的心思在 mvc 上。而asp.net web form 我認為該設計已到了一個顛峰,也就更難突破了。

asp.net web form 為了讓網頁的開發更像 VB Winform 的開發流程,特意地設計了 ViewState 的東西,讓 Web form 有了事件的概念。接著為了讓 Control 能順利地執行與開發,設計了 Page Life cycle。由 page life cycle 與 event 交織出來的複雜度,實在很難讓開發人員深入地了解。如下圖。

ASP.NET Page Life Cycle Diagram

而 asp.net mvc 返璞歸真地去除了這此 page life cycle、event 的困擾,以簡單的責任分工方式來開發設計,相對地容易。

結論

我認為,asp.net mvc 將來會成為主流。然而 web form 的生產力較高,也容易產生第三方的元件,也不會因此而消失。

2010年5月3日 星期一

CodeRushExpress for VS2010

可到這裡下載

http://www.devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/ 

經我測試,仍然有些不穩定。例如,如果有安裝 Visual Studio 2008, 並不會自動將CodeRushExpress 9.0 版自動移除,造成一登入 Visual Studio 2008 會出現一堆的 addin not found 的錯誤訊息。

今天早上在 VS2010 上Rename  一個 class 名稱時,也出現了 Critical 的錯誤,導致 VS2010 要求重起。

但,大致來說還能接受,還是安裝了,並不移除。

[20100518]

新版本似乎比較穩定一些

CodeRushXpress-10.1.2.exe

[20100524]

取得最新的版本

Share with Facebook