當前位置:開發者網絡 >> 技術教程 >> .NET教程 >> Web Service開發 >> 內容
精彩推薦
分類最新教程
分類熱點教程
    
當VS.NET2003遇上VS.NET2005,WebService部署何去何從
作者:未知
日期:2005-03-11
人氣:
投稿:snow(轉貼)
來源:未知
字體:
收藏:加入瀏覽器收藏
以下正文:
問題描敘】

重裝操作系統之後,部署原來的Web Service出現無法訪問、無法調試的問題

【原編程環境】

VS.NET2003(.NET Framework 1.1 SP1),Windows XP SP1

【新編程環境】

VS.NET2003(.NET Framework 1.1 SP1),VS.NET 2005 Beta1(.NET Framework 2.0 ),Windows XP SP2

【問題解決過程】



因為原來的項目一直使用工具VS.NET 2003,所以雖然VS.NET 2005 Beta已經出來好久了,卻沒有時間細細品味,現在項目告一段落,終於有機會了。

重裝系統之後,所有工具都安裝完畢,便將原來的Web Service源代碼直接拷貝到 C:\Inetpub\wwwroot 目錄下,在「Internet 信息服務(IIS)」中創建為虛擬目錄,然後用 VS.NET2003打開部署,習慣性的(CTRL+F5)就開始運行了,一切正常,然後試著調用其中的一個方法,卻總是出現如下錯誤:


System.TypeInitializationException: The type initializer for 'System.Transactions.Diagnostics.DiagnosticTrace' threw an exception. ---> System.UnauthorizedAccessException: The source was not found, but some or all event logs could not be searched. Inaccessible logs: Security.
at System.Diagnostics.EventLog.FindSourceRegistration(String source, String machineName, Boolean readOnly)
at System.Diagnostics.EventLog.SourceExists(String source, String machineName)
at System.Diagnostics.EventLog.SourceExists(String source)
at System.Transactions.Diagnostics.DiagnosticTrace..cctor()
--- End of inner exception stack trace ---
at System.Transactions.Diagnostics.DiagnosticTrace.get_Verbose()
at System.Transactions.Transaction.get_Current()
at System.Data.Common.ADP.GetCurrentTransaction()
at System.Data.Common.ADP.GetCurrentTransaction()
at System.Data.ProviderBase.DbConnectionPool.GetFromTransactedPool(Transaction& transaction)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(Object owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnectionBase owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnectionBase outerConnection)
at System.Data.ProviderBase.DbConnectionBase.Open()
at System.Data.SqlClient.SqlConnection.Open()
at Ezhi.DataAccess.DbHelper.DataAccessHelper.ExecuteDataset(CommandType commandType, String commandText, DataSet dsData, IDbDataParameter[] commandParameters)
at Ezhi.DataAccess.AccessClass.MealModule.RestaurantAccess.GetData(RestaurantData dsData, Int32[] iID)
at JolloRealService.EzhiServices.EzhiService.FillRestaurant()
at JolloRealService.EzhiServices.EzhiService..ctor()


一看出現了「System.TypeInitializationException:」和「Security」的字眼,就知道是安全問題,但是到底問題出在哪裡?我一頭霧水:是程序的問題?是Windows SP2的問題?是權限的問題?等等等等。於是便想通過 F5 來調試看看,結果彈出如下警告框:





確實看到了「沒有啟用集成Windows身份驗證「,初步確定是權限問題,點擊幫助,就進入了MSDN的如下地址頁面

ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/vsdebug/html/vxtbsErrorDebuggingFailedBecauseIntegratedWindowsAuthenticationIsNotEnabled.htm



錯誤:調試失敗,因為沒有啟用集成 Windows 身份驗證

由於沒有啟用集成 Windows 身份驗證,單步執行 Web 應用程序或 XML Web services 失敗。因此無法對要求調試的用戶進行身份驗證。

啟用集成 Windows 身份驗證

1. 用管理員帳戶登錄到 Web 服務器。

2. 從「開始」菜單中,打開「管理工具」控制面板。

3. 在「管理工具」窗口中雙擊「Internet 信息服務」。

4. 在「Internet 信息服務」窗口中,使用樹控件打開針對 Web 服務器命名的節點。

5. 「Web 站點」文件夾出現在服務器名的下面。

6. 您可以為所有 Web 站點或個別 Web 站點配置身份驗證。要為所有 Web 站點配置身份驗證,請右擊「Web 站點」文件夾並從快捷菜單中選擇「屬性」。要為個別 Web 站點配置身份驗證,請打開「Web 站點」文件夾,右擊個別 Web 站點,並從快捷菜單中選擇「屬性」。

7. 在「屬性」對話框中,選擇「目錄安全性」選項卡。

8. 在「匿名訪問和身份驗證」部分,單擊「編輯」按鈕。

9. 在「身份驗證方法」對話框的「已授權的訪問」下,選擇「集成 Windows 身份驗證」。

10. 單擊「確定」關閉「身份驗證方法」對話框。

11. 單擊「確定」關閉「屬性」對話框。

12. 關閉「Internet 信息服務」窗口。

按照以上步驟,我把「集成Windows身份驗證」勾上了,如下圖:





再次按下 F5,心想總得允許我調試了吧,結果又蹦出了個對話框:



ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/vsdebug/html/vxtbsHTTPServerErrors.htm

錯誤:無法在 Web 服務器上啟動調試

請參見

調試腳本和 Web:錯誤和疑難解答

當試圖對運行在 Web 服務器上的應用程序進行調試時,有時可能會得到具有以下錯誤信息的消息:

Unable to start debugging on the Web server

如果遇到這些錯誤,則需要考慮以下幾個問題:

要檢查的內容
遠程服務器上的 Web 應用程序
存儲在 Visual SourceSafe 中並使用 FrontPage 服務器擴展的 Web 應用程序
手動附加


這下就更蒙了,完全不知道問題出在哪裡了,都不允許我調試了!老辦法,部署一下看看,我便又(CTRL+F5)了一下,再次調用某個方法,結果還是出現原來的錯誤System.TypeInitializationException:





因為程序以前調試過,所以應該不是程序的問題,那會不會是版本的問題呢,1.1和2.0的衝突?我仔細的檢查了一下 IIS 中的設置,發現有如下一項:



發現默認的 ASP.NET Version 是2.0版本的,也就是說IIS默認選擇了高版本的 Framework,我把版本選擇為 1.1.4322.0,然後點「確定」,再F5調試,這次成功了,再調用方法,一切通過!



【問題延伸】

問題是解決了,回過頭來,為什麼會出現

System.TypeInitializationException: The type initializer for 'System.Transactions.Diagnostics.DiagnosticTrace' threw an exception. ---> System.UnauthorizedAccessException: The source was not found, but some or all event logs could not be searched. Inaccessible logs: Security.

的錯誤呢?如何通過MSDN的提示找出是版本問題呢?

查看MSDN:

System.TypeInitializationException:作為由類初始值設定項引發的異常周圍的包裝引發的異常。無法繼承此類。

System.UnauthorizedAccessException:當操作系統因 I/O 錯誤或指定類型的安全錯誤而拒絕訪問時所引發的異常。

僅僅通過這一點信息,我們是無法確定的,於是我Google了一下 「System.UnauthorizedAccessException」

找到以下幾個有用的信息:

一、

http://blog.csdn.net/wwwsq/archive/2004/11/30/198945.aspx

[ASP.NET]System.UnauthorizedAccessException: 拒絕訪問。

二、

http://www.error-bank.com/microsoft.public.dotnet.framework.webservices/4131_Thread.aspx

這個帖子討論的一個部署WebService的相關問題,與權限相關,但卻和我發現的這個問題無關



看來,出現System.UnauthorizedAccessException的問題有很多種,在這個問題裡面,唯一的解釋就是:

.NET Framework1.1和.NET Framework2.0 之間有一個權限級別,相對來說2.0的權限更高,1.1的程序無法正常調用2.0的組件。

相關文章: