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

时间:2019-05-17 14:01:40

标签: c# iis asp.net-core .net-core access-violation

我看到应用托管为dotnet.exe,而我的应用却简单

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

            .UseEnvironment(environment)

            //.UseIIS() //even commented those; still no effort
            //.UseIISIntegration()
            .UseStartup<Startup>()

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

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

4 个答案:

答案 0 :(得分:2)

您真正在谈论的是两种不同的事物。首先,您具有使用IIS之类的Web服务器运行而不是直接通过Kestrel运行的概念。然后,就有了在proc中或在proc中之外在IIS中运行的概念。

让我们先来。每当您在IIS中运行任何内容时,您都会获得w3wp.exe进程(如果通过Web场运行,则会得到多个进程)。确实与.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请求。

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

答案 1 :(得分:0)

答案 2 :(得分:0)

dotnet.exe说,它托管在默认的Kestrel Web服务器上,而不是IIS w3wp.exeKestrel是默认的托管环境(内部托管)。检查您的LaunchSetting.json文件,大多数情况下,您已将IIS配置为用于托管应用程序

答案 3 :(得分:0)

dotnet.exe 是Kestrel服务器的工作进程名称。它是内部Web服务器,默认情况下包含在.netcoreweb应用程序中。当.netcore应用程序在Kertrel服务器上运行时,dotnet.exe将处理传入的请求。

w3wp.ex 是IIS Web服务器的工作进程名称。当应用程序在IIS服务器上运行时,w3wp.exe会处理传入的请求。