HTTP 错误500.35-ANCM 同一进程中的多个在进程应用程序 ASP.NET Core 3

从今天早上开始,在没有对项目代码做任何修改的情况下,一个非常简单的 Web API,一个控制器和3个方法,在 Swagger 中,它不再启动,我得到了一个错误:

HTTP 错误500.35-ANCM 同一进程中的多个在进程应用程序

事件查看器报告最无用的消息:

IIS Express AspNetCore Module V2: 启动应用程序失败 ’/LM/W3SVC/2/ROOT/docs’,ErrorCode’0x80004005’。

重启了系统好几次。

我正在使用 VisualStudio2019,这个应用程序成功地编译了,几分钟前它还运行良好。没有安装新软件,没有添加软件包。 Tried also clean and rebuild.

我刚刚修改了一个方法的注释。显然,我也试图恢复以前的评论,但我总是得到相同的消息。

我能做什么?

网核还是太不稳定,不能专业使用吗?

更新

从相同版本的 VisualStudio 启动的相同代码在另一台 PC 上正常运行。

更新2

Below the code of the application:

Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;
using System;
using System.IO;
using System.Reflection;


namespace WFP_GeoAPIs
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}


public IConfiguration Configuration { get; }


public void ConfigureServices(IServiceCollection services)
{


services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo() { Title = "Geographic APIs", Version = "v1.0.0" });
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.XML";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
c.IncludeXmlComments(xmlPath);
});
}


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}


app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "swagger-ui")),
RequestPath = "/swagger-ui"
});


app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();


app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});


app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "GeoAPIs Ver 1.0.0");
c.RoutePrefix = "docs";
c.InjectStylesheet("/swagger-ui/custom.css");
});
}
}
}

下面是 launchsettings.json:

{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:51319",
"sslPort": 44345
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "docs",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WFP_GeoAPIs": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "docs",
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

但是在另一台 PC 上使用相同的 Visual Studio 版本处理该项目效果很好,因此看起来就像是。NET 核心或 VisualStudio 属性..。

70515 次浏览

感谢 @ Lex Li,他给了我解决方案。

问题出在 applicationhost.config 中,这个元数据库文件包含 Visual Studio 启动 IISExpress 以运行 Web 应用程序的所有设置。

对于 VisualStudio2019,此文件位于

$(solutionDir)\.vs\{projectName}\config\applicationhost.config

其他版本请查看这篇文章: 在哪里可以找到 IIS Express 配置/元数据库文件?

根据我有以下一节:

<sites>
<site name="WebSite1" id="1" serverAutoStart="true">
<application path="/">
<virtualDirectory path="/" physicalPath="%IIS_SITES_HOME%\WebSite1" />
</application>
<bindings>
<binding protocol="http" bindingInformation=":8080:localhost" />
</bindings>
</site>


<site name="MyProjectName" id="2">
<application path="/" applicationPool="MyProjectName AppPool">
<virtualDirectory path="/" physicalPath="E:\Projects\MyProjectName" />
</application>


<application path="/docs" applicationPool="docs AppPool">
<virtualDirectory path="/" physicalPath="E:\Projects\MyProjectName" />
</application>


<bindings>
<binding protocol="http" bindingInformation="*:59386:localhost" />
<binding protocol="https" bindingInformation="*:44345:localhost" />
</bindings>
</site>
<siteDefaults>
<!-- To enable logging, please change the below attribute "enabled" to "true" -->
<logFile logFormat="W3C" directory="%AppData%\Microsoft\IISExpressLogs" enabled="false" />
<traceFailedRequestsLogging directory="%AppData%\Microsoft" enabled="false" maxLogFileSizeKB="1024" />
</siteDefaults>
<applicationDefaults applicationPool="Clr4IntegratedAppPool" />
<virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>

哪里有一些奇怪的设置定义

<application path="/docs" applicationPool="docs AppPool">
<virtualDirectory path="/" physicalPath="E:\Projects\MyProjectName" />
</application>

当我试图将/docs 路径设置为 start 文件夹时,已经添加了。

注释掉这个设置以及文件末尾与这个路径相关的另一个设置就解决了这个问题。

我在执行以下操作时也出现了同样的错误:

  1. Published two separate asp.net core websites
  2. 在 IIS 中,在“默认网站”下创建了两个网站,每个网站的物理路径分别设置为(1)中的每个发布文件夹。
  3. 现在,无论我打开哪个网站,第一个工作,第二个给出了错误。

问题:

由于我的两个站点都在“ DefaultWebSite”下,因此它们都在使用 DefaultAppPool,这是导致此错误的原因。当站点不在“默认网站”下但使用相同的应用程序池时,也会发生同样的错误。

解决方案:

正如 医生中提到的,

要修复此错误,请在单独的 IIS 应用程序池中运行应用程序。

对我来说,当我开始为每个站点使用单独的应用程序池时,这个问题就解决了。

It's currently a 臭虫 in VS2019 - (Nov 4 '2019)

关闭你的解决方案

2) 删除文件夹 .vs中的 applicationhost.config or删除整个 .vs文件夹。

.vs文件夹是 隐藏文件夹文件夹,通常位于解决方案文件的旁边。

enter image description here

重新启动您的解决方案

我通过在发布解决方案后生成的 web.config 文件中删除 V2来修复这个问题。

<handlers>
<add name="aspNetCore" path="*" verb="*"
modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>

instead of

<handlers>
<add name="aspNetCore" path="*" verb="*"
modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>

In .csproj file, set:

<PropertyGroup>
...
<AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
</PropertyGroup>

允许主机使用相同的池

我也有同样的问题。

在标签中的.csproj 文件中添加这一行: <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel >

虽然它是500.30错误,它也修复了500.35问题。

HTTP 错误500.30-ANCM 进程内启动失败

I hope help you.

最好的问候。

对我来说最简单可靠的想法是,只需在主应用程序中放入一个简单的 index.html,并将解决方案中的每个应用程序都视为子应用程序。

.csproj文件中,你可以添加 OutOfProcess:

  <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
</PropertyGroup>

这将在 web.config中产生(在发布时) :

<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\WebApplication3.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="OutOfProcess" />
</system.webServer>
</location>
</configuration>

注意 OutOfProcess,

另一种方法是从 web.config 中删除 V2

如果您在将应用程序部署到服务器(内部或第三方主机提供商)后看到这个错误(HTTP Error 500.35-Multi In-Process Applications in same Process ASP.NET Core 3) ,可能是相关模块没有安装在主机服务器上。

在我的例子中,它没有 AspNetCoreModuleV2,我不得不从以下地方更新 web.config:

<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />

致:

<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />

或者,也可以在. csproj 文件中设置如下:

<PropertyGroup>
<AspNetCoreModuleName>AspNetCoreModule</AspNetCoreModuleName>
</PropertyGroup>

在我的案例中,只要将应用程序池切换到.NET v2.0就可以解决这个问题 enter image description here

在此输入图像描述

Change from inprocess to OutOfprocess in Web.config

Net Core 6,发布后编辑 web.config文件,并将 hostingModel="InProcess"更改为 hostingModel="OutofProcess"

<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore .... hostingModel="OutOfProcess" stdoutLogFile=".\logs\stdout" />
</system.webServer>

我把 modules设计成 V2,它起作用了。

在我的案例中,这是因为依赖注入(. Net Core 3.1)。 我已经使用了 ILogger,但是没有在构造函数注入中提供类型 ILogger<type> logger。我刚刚提供了 ILogger logger导致的 "HTTP Error 500.30 - ANCM In-Process Start Failure" shown while running the API.

试图按照建议查看事件查看器日志,但徒劳无功: (。

最后在 VS Output 窗口中寻找线索,发现了这一点 "Exception thrown: 'System.AggregateException' in Microsoft.Extensions.DependencyInjection.dll"

我回忆了最近的更改,然后继续在构造函数中提供类型,它工作得很好。