当VS.NET2003遇上VS.NET2005
WebService部署何去何从
作者:贺星河(hxhbluestar)
时间:2005-1-16
【问题描叙】
重装操作系统之后,部署原来的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 服务器上的应用程序进行调试时,有时可能会得到具有以下错误信息的消息:
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的组件。
【后话】
初步推测会出现这个问题的原因是Framwork之间的互操作权限问题,欢迎讨论。