dotnet.exe 与 w3wp.exe:有什么区别?

Tro*_*acy 1 c# iis access-violation .net-core asp.net-core

我看到应用程序托管为dotnet.exe而我的应用程序简单

       WebHost
              .CreateDefaultBuilder(args)
              .UseConfiguration(config)
            //.UseContentRoot(Directory.GetCurrentDirectory())

            .UseEnvironment(environment)

            //.UseIIS() //even commented those; still no effort
            //.UseIISIntegration()
            .UseStartup<Startup>()
Run Code Online (Sandbox Code Playgroud)

运行为w3wp.exe.
有什么区别以及如何切换?我之所以这么问,是因为dotnet.exe托管应用程序在处理大量数据(> 5GB)时运行良好,而我的应用程序w3wp.exe在 2.6GB 上运行失败AccessViolation

更新:我的应用程序在非托管池上运行,而基于 dotnet.exe 的应用程序使用.NET 4.

Chr*_*att 5

你真正谈论的是两件不同的事情。首先,您了解使用 IIS 等 Web 服务器运行与直接通过 Kestrel 运行的概念。然后,存在在 IIS 中作为进程内或进程外运行的概念。

我们先来看第一个。每当您在 IIS 中运行任何内容时,您都会获得 w3wp.exe 进程(如果通过网络场运行,则会获得多个进程)。这实际上与.NET Core无关,它只是IIS中应用程序池的进程。您还可以选择直接使用dotnet.exe(Kestrel) 运行您的应用程序,这当然会导致该进程运行。

然后,如果您托管在 IIS 中,则可以在 proc 或 out 中运行。对于进程外(前一种默认方式)(实际上是前一种唯一方式),IIS 充当反向代理 - 应用程序池 (w3wp.exe) 将请求代理到通过 Kestrel (dotnet.exe) 运行的实际应用程序进程。在这种情况下,两个进程都存在,因为两个进程都在使用。ASP.NET Core 2.2 引入了一种新的托管模型:在进程中,ASP.NET Core 应用程序直接在应用程序池中运行,结果只是 w3wp.exe。

无论长短,这些过程的存在或不存在取决于您正在做什么。如果您以任何形式使用 IIS,w3wp.exe 都是不可避免的。

FWIW,“w3wp”是“万维网工作进程”的缩写。这可能会让它在 IIS 托管场景中无处不在的原因变得更加明显:它实际上是工作进程,而不是处理 Web 请求。

至于您更具体的问题,本质上可以归结为内存不足,除了内存的分配方式之外,这实际上与其他任何事情都没有关系。32 位的 2.6GB 阈值令人尖叫:最大分配为 4GB,其中一部分用于处理开销。但是,您没有理由必须运行 32 位。如果您的应用程序池运行 64 位,理论上您可以访问比实际需要更多的内存。简而言之,IIS 或 w3wp.exe 进程没有任何固有的东西将您锁定为仅 2.6GB 的可分配内存。一定还有其他事情在起作用。