解決在 Visual Studio 中因為權限不足而無法建置網站的問題

前陣子遇到一個很怪的問題,在正常的安裝下竟然有個專案從 SVN 版本庫簽出後無法正確安裝至我本機的 IIS7 中執行,甚至於無法在 Visual Studio 執行建置(Build),而且錯誤的狀況都是跟權限有關,但我花了好一段時間才將這個問題解決,原來就是卡在一個很小的地方沒注意到。

這次發生的錯誤訊息如下:

Access to the path 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\Project1\265814f7\8b06370e\App_Code.compiled' is denied.

這代表在 ASP.NET 動態編譯時期就無法完成,因為動態編譯的過程中無法存取動態產生的檔案,以致於無法正確編譯網站程式,所以發生錯誤。

以前我也曾經遇過這個問題,這通常與應用程式集區的執行身份識別有關(請見 IIS應用程式集區自訂身份識別後如何讓 ASP.NET 正常執行 一文),但這次狀況更奇怪,通常在 IIS 下無法執行的狀況只要把自訂身份識別的帳戶加入 IIS_WPG 群組 (IIS6) 或加入 IIS_IUSRS 群組 (IIS7) 即可,而且通常在 Visual Studio 編譯時用的是登入者的身份 (Administrator),怎麼可能會有無法編譯且沒有權限的情勢發生呢?

以下是在 Visual Studio 編譯時所發生的錯誤訊息:

------ Build started: Project: D:\...\WebSite1\, Configuration: Debug Any CPU ------
Validating Web Site
Building directory '/WebSite1/App_Code/'.
(0): Build (web): Could not load file or assembly 'AntiXssLibrary, Version=3.1.3524.16873, Culture=neutral, PublicKeyToken=d127efab8a9c114f' or one of its dependencies. Access is denied.

Validation Complete
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========

所以是在 Validating Web Site (驗證網站) 時發生「存取被拒(Access is denied)」的情況,但這代表我 (Administrator) 無法驗證網站嗎?

最後查到原因是因為在 web.config 定義了以下這段

<identity impersonate="true" userName="UserA" password="Passw0rd" />

因為在 web.config 已經定義了 變身 (Impersonation) 的設定,所以在 Visual Studio 中建置時,雖然可以正確編譯網站,部署到公司內的測試機也可以執行,但在編譯時的驗證網站這一段會以該 UserA 使用者的身份執行,而該使用者在我本機剛好也不隸屬於任何群組,所以也沒有任何權限,導致建置時無法在 ASP.NET 的暫存目錄 (C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files) 寫入檔案,以致於無法 建置(Build)成功!

最後我將該使用者 UserA 加入到 IIS_IUSRS 群組,所有問題自然迎刃而解,如下圖示:

這問題一開始並沒那麼直覺,只是覺得納悶說為什麼會有 存取被拒(Access is denied) 的情況,經過一個小時的盤查才查出結果。

  

此文章由 will 發表於 2010/2/10 上午 11:46:27

永久連結 | 評論 (1) | 此文章的RSSRSS comment feed |

分類: ASP.NET | IIS | Visual Studio

標籤: , , , , ,

收藏:

解決 ASP.NET MVC 專案無法在 VS2008 使用快速鍵的問題

當在你的 Visual Studio 2008 同時安裝 ASP.NET MVC 1.0 與 2.0 Beta 的版本時,很有可能會遇到開啟 ASP.NET MVC 2.0 專案時無法使用快速鍵(Shortcuts)的問題,這個問題是因為你之前在安裝 ASP.NET MVC 1.0 時快速鍵就已經註冊進 Visual Studio 之中,導致安裝 ASP.NET MVC 2.0 Beta 時無法註冊成功,這時只要做個在 [工具] / [選項] 的 [鍵盤] 重新設定即可。

當你在 ASP.NET MVC 2.0 專案的 Controller Action 裡按下 Ctrl + M + Ctrl + G 時會出現以下訊息:

The key combination (Ctrl+M, Ctrl+G) is bound to command (Go To &View) which is not currently available.

在 [Tools] / [Options] 的 [Keyboard] 的設定中,在 Show commands containing: 欄位輸入 GoToView

 

這是你會搜尋出兩個完全一樣的巨集名稱,其實一個是 ASP.NET MVC 1.0 用的,另一個是 ASP.NET MVC 2.0 Beta 用的,而其中已經已經註冊了快速鍵,另一個則沒有,註冊的那個就是 ASP.NET MVC 1.0 的版本。

像我們最近已經開使用 ASP.NET MVC 2.0 開發專案,所以當要開發 ASP.NET MVC 2.0 專案時就可以將快速鍵指定(Assign)到另一個同名的巨集上即可。但除了 GoToView 之外還有 GoToController 這個巨集要設訂,修改快速鍵的流程如下:

  1. 先輸入 Show commands containing 搜尋出所需巨集
    1. GoToView
    2. GoToController
  2. 點選另一個同名巨集
  3. 選取 Use new shortcut in 欄位
    1. GoToView  →   選取 Text Editor
    2. GoToController  →   選取 HTML Editor Source View
  4. 用滑鼠點擊 Press shortcut keys 欄位,並透過鍵盤按下快速鍵 ( Ctrl + M , Ctrl + G )
  5. 用滑鼠點擊 [Assign] 按鈕,再按下 [OK] 即可完成設定

分別設定的示意圖如下:

image

image

  

此文章由 will 發表於 2010/1/1 下午 04:25:26

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET MVC | Tips | Visual Studio

標籤: , , , , ,

收藏:

如何關閉 PowerCommands for VS2008 的 Undo Close 視窗

PowerCommands 在裝好之後每次只要重新開啟專案都會自動開啟 Undo Close 視窗,像我通常習慣沒用到的視窗就全部關閉,而 Undo Close 每次都會自動開啟讓我覺得很不是滋味,之前網友 ChrisTorng留言告知解決方法,不過我現在的電腦是 Windows 7 (x64) 的環境,導致機碼位置改變了,所以決定寫一篇文章來記錄修改的方式。

 PowerCommands for VS2008 的 Undo Close 工具視窗

[ 手動修改的方式 ]

  1. 開啟 regedit.exe 程式
  2. 刪除以下機碼
    • 在 x86 作業系統下的機碼路徑
      • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\ToolWindows\{eccc9e97-fd3b-4c15-af76-ef71a71d8b17}\Visibility
    • 在 x64 作業系統下的機碼路徑
      • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\ToolWindows\{eccc9e97-fd3b-4c15-af76-ef71a71d8b17}\Visibility

[ 自動修改的方式 ]

直接下載我製作的機碼檔,下載後解壓縮並點選合併後即可:

備註:此機碼檔同時可刪除 x86 與 x64 環境下的機碼,所以下載一個檔即可。

合併機碼 

相關連結

  

此文章由 will 發表於 2009/9/27 上午 12:33:13

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Visual Studio

標籤: , ,

收藏:

ASP.NET MVC 內建測試專案如何設定啟用 Code Coverage

昨天上了李智樺老師的真實世界的測試開發技術導論課程,感覺獲益良多,回來就馬上套用到 ASP.NET MVC 的測試專案自行練習一番,結果卻發現怎樣都找不到老師在課堂上展示的 Code Coverage 設定選項,以致於雖然可以測試但就是看不到 Code Coverage 的分析數據,以下就是設定啟用 Code Coverage 功能的說明。

建立 MVC 專案時可以順便建立 單元測試(Unit Test) 專案

建立 MVC 專案時可以順便建立 單元測試(Unit Test) 專案

在方案總管新增一個 Test Run Configuration 項目

在方案總管新增一個 Test Run Configuration 項目

選取 [Test Run Configuration] / [Test Run Configuration] 並按下 [Add] 新增進去

選取 [Test Run Configuration] / [Test Run Configuration] 並按下 [Add] 新增進去

新增完後會在 方案總管(Solution Explorer) 看到新增的 Solution Items

新增完後會在 方案總管(Solution Explorer) 看到新增的 Solution Items

同時間也會跳出 testrunconfig1.testrunconfig 設定對話框,請切換到 [Code Coverage] 頁籤並勾選 MvcApplication 專案,讓該專案在被測試時可以自動計算 Code Coverage 相關數據。

同時間也會跳出 testrunconfig1.testrunconfig 設定對話框,請切換到 [Code Coverage] 頁籤並勾選 MvcApplication 專案,讓該專案在被測試時可以自動計算 Code Coverage 相關數據。

最後,進行測試時就可以查看到 Code Coverage 的數據了!

開啟 Code Coverage Results 視窗

Code Coverage Results

相關連結

  

此文章由 will 發表於 2009/9/24 下午 08:49:03

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET MVC | Visual Studio

標籤: , , ,

收藏:

如何善用「偵錯模式」進行 ASP.NET 網站或 .NET 程式開發

在專案開發初期,我們都會寫很多測試程式碼(Test Code)用來紀錄或顯示程式執行時期的狀態,雖然開發環境有中斷點 (Breakpoint) 可以使用,但程式部署到測試機或正式機時卻未必有開發工具可用,這時利用自己寫的測試程式碼就非常有用,但專案上線前若又需要把測試程式碼刪除頗為麻煩,今天我就打算分享一些很實務的偵錯開發技巧。

在 C# 中有個 #if 語法非常的實用,不過好像很少人在用。請先參考下圖的 Solution Configuration (方案設置) 選單,預設就有 Debug 與 Release 兩個選項可用,當專案需要建置時可以利用這兩個選項進行快速切換,以產生不同的組件輸出。

Solution Configuration (方案設置) 選單

在你的程式中,可能會有以下的 Debug Code

ViewData["Message"] += "(DEBUG)";

透過 #if 語法與 #endif 語法的包夾之後,你會發現在開發環境似乎沒什麼變化

透過 #if 語法與 #endif 語法的包夾

但是當你將 Solution Configuration 選單切換至 Release 之後

Solution Configuration (方案設置) 選單

你就可以看見原本被 #if DEBUG#endif 語法的包夾過的程式碼自動變「灰色」的了

原本被 #if DEBUG 與 #endif 語法的包夾過的程式碼自動變「灰色」

這也代表著在將 Solution Configuration 選單切換至 Release 之後所建置 (Build) 出來的組件不會包含這些測試的程式碼,當組件部署至正式機時也完全不會影響程式執行的效率,因為 Visual Studio 在建置時 ( 或 C# 編譯器在編譯時 ) 就自動將這些 Debug Code 忽略掉。

同樣的技巧若套用在 ASP.NET Web Site (ASP.NET 網站) 專案就有點不同了,由於 ASP.NET 網站是個特殊的專案類型,執行時期所有程式碼都是動態編譯的,所以你無法利用這個技巧在 Visual Studio 開發工具中,但僅限於看到的程式碼全部都會出現灰色字而已,如下圖示:

雖然 Solution Configuration 已經切換至 Debug 項目,但程式碼中依然出現灰底字

雖然 Solution Configuration 已經切換至 Debug 項目,但程式碼中依然出現灰底字,那是因為 ASP.NET Web Site 是動態編譯的,當網站還在 Visual Studio 中程式碼尚未進行編譯(即便你按 F6 編譯也一樣),所以無法判斷目前的編譯環境。

ASP.NET Web Site 是否處於 Debug 模式是在 web.config 中定義的,當 compilation 的 debug 屬性設定為 true 時,動態編譯的程式碼就會自動套用 #if DEBUG#endif 語法,所以即便 Visual Studio 中無法預覽目前的程式碼狀態,但實際上在執行時一樣有支援這個開發技巧。

ASP.NET Web Site 是否處於 Debug 模式是在 web.config 中定義的

除此之外,在 ASP.NET 中如果需要寫程式判斷目前運行的是否處於「偵錯模式」的話,也可以透過 HttpContext.IsDebuggingEnabled 屬性來判斷,如下程式範例:

if (HttpContext.Current.IsDebuggingEnabled)
{
Response.Write("<h1>DEBUG Enabled</h1>");
}

實務上判斷目前網站是否處於「偵錯模式」其實非常有用,我們可以動態針對網站進行最佳化的動作,例如自動啟用網頁內容壓縮、JavaScript 內容最小化、壓縮 CSS 檔案、刪除或關閉特定的程式記錄、…等等,至於其他運用就要靠各位的創意發想了。

相關連結

  

此文章由 will 發表於 2009/9/16 下午 08:57:23

永久連結 | 評論 (4) | 此文章的RSSRSS comment feed |

分類: ASP.NET | ASP.NET MVC | Visual Studio | .Net | C#

標籤: , , , , , ,

收藏: