强制进程在IIS 8.5中以32位模式运行

问题描述

我有一个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

64-bit 32-bit

两者的运行过程都是w3wp.exe,但是在您发现的不同文件夹下。现在找不到如何运行早期IIS的方法,只有win7之前的系统才是IIS的早期版本,Microsoft一直建议使用64位操作模式。

在最新版本的IIS中,无论该进程是32位还是64位,它始终以w3wp.exe身份运行,并且您无法在系统磁盘中找到w3wp * 32.exe。 enter image description here

因此,对于您的第一个问题,从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();
    }