我看到应用托管为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
。
答案 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)
好像有一个答案-https://docs.microsoft.com/en-gb/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-2.2
这只是关于托管模型。
答案 2 :(得分:0)
dotnet.exe
说,它托管在默认的Kestrel
Web服务器上,而不是IIS w3wp.exe
。 Kestrel
是默认的托管环境(内部托管)。检查您的LaunchSetting.json
文件,大多数情况下,您已将IIS配置为用于托管应用程序
答案 3 :(得分:0)
dotnet.exe 是Kestrel服务器的工作进程名称。它是内部Web服务器,默认情况下包含在.netcoreweb应用程序中。当.netcore应用程序在Kertrel服务器上运行时,dotnet.exe将处理传入的请求。
w3wp.ex 是IIS Web服务器的工作进程名称。当应用程序在IIS服务器上运行时,w3wp.exe会处理传入的请求。