Chinaunix首页 | 论坛 | 博客
  • 博客访问: 196761
  • 博文数量: 60
  • 博客积分: 3269
  • 博客等级: 中校
  • 技术积分: 648
  • 用 户 组: 普通用户
  • 注册时间: 2005-09-21 10:48
文章存档

2012年(6)

2011年(6)

2010年(30)

2009年(8)

2007年(6)

2005年(4)

我的朋友

分类: 系统运维

2011-08-20 13:27:36

  在一个服务器上建立运行两个网站,通过主机头区分访问,但是在访问时出现“Server Application Unavailable”或“服务器应用程序不可用”错误。
  主要问题是这两个网站在设置中分别使用了不同的.net版本。一个是.net v2.0,另一个是.net v4.0。改成相同的v4.0,问题就解决了。
  下面的网文写得很好,CP过来。
====================================================================
    今天我朋友将其从1.1升级至2.0的项目发布至公司安装有windows 2003的服务器上,结果2.0的项目始终无法成功运行。甚至还造成服务器上正在为全公司服务的基于.net Framework 1.1的web程序出错。他感觉很奇怪,在自己电脑上明明运行的很好啊,怎么一到服务器上就不行了?他发布2.0 web程序的过程如下:
    1、在服务器上创建一个目录,然后将发布后的所有Web程序的文件复制到这个新建的目录。
    2、在服务器的IIS上新建一个虚拟目录,然后将其配置成可以执行脚本的应用程序,(过程与创建.net Framework 1.1版本的程序相同。) 然后,将此虚拟目录的.net Framework 配置成2.0。
    大功告成后,开始访问刚配置的程序,却得到如上Server Application Unavailable的错误。
 
    之后向我求助,经过仔细阅读了IIS帮助文档,才发现,原来这个错误是由 IIS6 应用程序隔离机制造成的。IIS默认的应用程序隔离机制被称为:“工作进程隔离模式”,在此模式中,应用程序被分为多个组,每个组就是一个“应用程序池” ,每个应用程序池之间是相互隔离的。隔离的好处当然就是安全啦,稳定啦,等等。IIS中的每个应用程序池由一个“工作进程”分别进行管理,也就是"W3wp.exe" 。如果有多个应用程序池中的程序运行,我们就能看到多个w3wp.exe。我们平时新建的虚拟目录都默认被指向IIS6的“DefaultApp
Pool" 中,所以在默认情况下,不管你有多少个asp.net程序在运行,在“Windows任务管理器”中你只能看到一个w3wp.exe进程。
 
    出现上述错误的原因是: .net Framework 2.0的程序与.net Framework1.1(或1.0)的程序被放入同一个应用程序池(默认情况下放入DefaultAppPool池),也就是由同一个工作进程: w3wp.exe 进行管理,而单个工作进程是无法同时管理不同的程序(或者不同版本的程序)的。如果先访问.net framework 1.1的页面,则工作进程先加载并管理了 1.1版本的程序集,此时访问.net framework 2.0的web程序页面,Server Application Unavailable 错误就出来了。 反之,如果在默认应用程序池的w3wp.exe尚未启动前先访问了 2.0的web程序(此时应用程序集已经加载了.net framework2.0的Web程序集),再访问1.1或1.0的Web程序页面时,同样会出现“服务器应用程序不可用” 这样的中文提示。(您可以结束掉以前的w3wp.exe进行测试。)
 
    我朋友之所以在自己的开发机器上没出现此错误是因为他在开发基于.net framework 2.0的项目时,一直都只访问这个2.0的web程序,跟本未曾访问过其他web程序。而朋友的服务器上已经存在1.0 的项目,并且一直有人使用。这个错误在今天之前从未碰到过,其实大部分人在开发一个项目时,都只访问正在开发的项目。很有可能就忽略了这个问题,而到了发布的时候却出现错误,搞得手忙脚乱。
 
    解决办法:在IIS中新建一个应用程序池,然后选中你的 基于.net framework 2.0的虚拟目录,点“属性”-》在“应用程序池” 中选择刚才新建的的应用程序池,点击“确定”。
如果你的电脑主要是为了学习,开发,测试web程序,完全可以建一个类似于名为"dotnet2.0"的应用程序池,以后所有新建的2.0的虚拟目录都指向此应用程序池。
 
    补充一下:
这个在微软官方的解释:
出现此问题的原因是进程模型用户帐户(默认情况下为 ASPNET)没有所需系统文件和文件夹的正确用户权限,以便运行 ASP.NET 工作进程。
要解决此问题,请验证该 ASPNET 帐户拥有如下所示的正确用户权限:
• %windir%\Microsoft.NET\Framework\Version\Temporary ASP.NET 文件:完全控制
• %windir%\Temp:完全控制
• 应用程序文件夹:读取
• %installroot% 层次结构(例如,%windir%\Microsoft.Net\Framework\Version):读取
• %windir%\Assembly:读取
注意:这是全局程序集缓存。不能直接使用 Windows 资源管理器编辑此文件夹的 ACL。正确做法是,打开命令窗口,然后运行以下命令:
cacls %windir%\assembly /e /t /p domain\useraccount:R
另外,在使用 Windows 资源管理器之前,请先运行以下命令以取消对 Shfusion.dll 的注册:
regsvr32–u shfusion.dll
在 Windows 资源管理器中设置了用户权限后,请运行以下命令重新注册 Shfusion.dll:
regsvr32 shfusion.dll
• 网站根目录(例如,%root%\Inetpub\Wwwroot)或默认网站指向的路径:读取
• %windir%\System32:读取
(通常情况下,ASPNET 帐户已被授予了用户组成员的用户权限。)
 
阅读(512) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~