问题描述
我有一个ASP.NET MVC应用程序,它使用“任何cpu”进行编译和部署。 它部署在Windows Server 2012 R2 64位标准版的IIS 8.5.9600.16385上。
在IIS管理器->应用程序池->我的应用程序池->高级设置中,我将“启用32位应用程序”设置设置为true。
据我所知,如果是这样,则意味着工作进程被强制以32位运行。如果设置为false,则应用程序池以64位模式运行。因此,以我为例,进程以32位运行(因为我将该设置设置为true),但是如果我打开任务管理器并检查w3wp.exe进程,它显示为w3wp.exe而不是w3wp * 32.exe?为什么?这是否意味着进程不是在32位上运行,而是实际上在64位上运行?
无论如何,我注意到,如果设置“启用32位应用程序”为true,则w3wp.exe进程指向C:\ Windows \ SysWOW64 \ inetsrv(此路径显示在任务管理器的进程属性中),而如果此设置为false,则指向C:\ Windows \ System32 \ inetsrv。
那么我可以做以下假设吗?
- C:\ Windows \ SysWOW64 \ inetsrv->表示w3wp.exe是32位 进程以32位模式运行。
- C:\ Windows \ System32 \ inetsrv->表示w3wp.exe是64位 进程以64位模式运行。
也许在早期版本的IIS中以32位模式运行时,w3wp.exe在任务管理器中显示为w3wp * 32.exe吗?并且在最新的IIS版本中,无论此进程以32位还是64位模式运行,该过程始终始终显示为w3wp.exe?
解决方法
根据使用“任何CPU”编译和部署的MVC应用程序的运行结果,如果enable 32位应用程序为false,则该应用程序以64位运行,而true为32位运行。关于“任何CPU”,您可以参考this thread。
两者的运行过程都是w3wp.exe,但是在您发现的不同文件夹下。现在找不到如何运行早期IIS的方法,只有win7之前的系统才是IIS的早期版本,Microsoft一直建议使用64位操作模式。
在最新版本的IIS中,无论该进程是32位还是64位,它始终以w3wp.exe身份运行,并且您无法在系统磁盘中找到w3wp * 32.exe。
因此,对于您的第一个问题,从syswow64运行w3wp.exe并不意味着该进程在64位上运行,而是取决于应用程序本身。因为MVC设置为Any CPU,所以在这种情况下为32位。如果应用程序本身强制运行64位,则由于Process Interoperability,它也可以运行。
这是MVC中的代码,您可以根据需要对其进行测试。
public ActionResult About()
{
if (IntPtr.Size == 4)
{
ViewBag.message = "32-bit";
}else if (IntPtr.Size == 8)
{
ViewBag.message = "64-bit";
}
else
{
ViewBag.message = "nothing";
}
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
if (Environment.Is64BitProcess)
Response.Write("64-bit process");
else
Response.Write("32-bit process");
return View();
}