当VS.NET2003遇上VS.NET2005,WebService部署何去何从

** 当 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 :错误和疑难解答

当试图对运行在 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 之间的互操作权限问题,欢迎讨论。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus