ASP.NET Core 3.1 - HTTP 错误 500.30 - ANCM 进程内启动失败

Posted

技术标签:

【中文标题】ASP.NET Core 3.1 - HTTP 错误 500.30 - ANCM 进程内启动失败【英文标题】:ASP.NET Core 3.1 - HTTP Error 500.30 - ANCM In-Process Start Failure 【发布时间】:2020-08-23 23:41:09 【问题描述】:

我正在使用 3.1 版本配置 net core web api。我已经在这里检查了这个问题,但没有一个答案适用于我的案例。

我尝试使用 net core ver 3.1 配置 web api。另一个具有类似配置和相同版本软件包的应用程序也可以在我的电脑上使用相同的 iis express。

这是我的Startup.cs

public class Startup
    
        public Startup(IConfiguration configuration)
        
            Configuration = configuration;
        
        public IConfiguration Configuration  get; 
        readonly string AllowSpecificOrigins = "_allowSpecificOrigins";


        public void ConfigureServices(IServiceCollection services)
        
            services.AddCors(options =>
            
                options.AddPolicy(AllowSpecificOrigins,
                builder =>
                
                    builder.AllowCredentials().AllowAnyMethod().AllowAnyHeader().WithOrigins("http://localhost:4200");
                );
            );

            services.AddControllers()
                .AddNewtonsoftJson();

            services.AddScoped<IAccountRepository, AccountRepository>();
            services.AddScoped<IDocsRepository, DocsRepository>();

            services.AddDbContext<LibContext>(options =>
                options.UseNpgsql(Configuration.GetConnectionString("LibraryDatabase"), x => x.UseNetTopologySuite()));

            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                
                    options.RequireHttpsMetadata = false; 
                    options.TokenValidationParameters = new TokenValidationParameters
                    
                        ValidateIssuer = true,
                        ValidIssuer = AuthOptions.ISSUER,
                        ValidateAudience = true,
                        ValidAudience = AuthOptions.AUDIENCE,
                        ValidateLifetime = true,
                        IssuerSigningKey = AuthOptions.GetSymmetricSecurityKey(),
                        ValidateIssuerSigningKey = true
                    ;                  
                );
            services.AddIdentity<ApplicationUser, IdentityRole>(options =>
            
                //password settings
                options.Password.RequiredLength = 8;
                options.Password.RequireNonAlphanumeric = false;

                options.User.RequireUniqueEmail = true;

                //lockout settings
                options.Lockout.AllowedForNewUsers = true;
                options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
                options.Lockout.MaxFailedAccessAttempts = 5;
            )
                .AddEntityFrameworkStores<LibContext>()
                .AddUserManager<UserManager<ApplicationUser>>()
                .AddDefaultTokenProviders();

            services.AddSignalR();

        


        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            
            app.UseCors(AllowSpecificOrigins); //DEV MODE!           
            app.UseStaticFiles();
            app.UseStaticFiles(new StaticFileOptions()
            
                FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"Library")),
                RequestPath = new PathString("/Library")
            );
            app.UseRouting();
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            
                endpoints.MapControllers();                
            );
        
    

我的appsettings.json 好像没有错别字


  "Logging": 
    "LogLevel": 
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    
  ,
  "AllowedHosts": "*",
  "ConnectionStrings": 
    "LibraryDatabase": "Host=localhost;Port=5432;Database=librarydb;Username=postgres;Password=mypasshere"
  

我的app.csproj

<Project Sdk="Microsoft.NET.Sdk.Web">

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

  <ItemGroup>
    <Folder Include="Library\" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.3" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.3" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.3" />
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="2.2.0" />
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite" Version="2.2.0" />
    <PackageReference Include="ProjNET4GeoAPI" Version="1.4.1" />
  </ItemGroup>


</Project>

事件查看器抛出 2 个错误,但我不知道出了什么问题。错误:

物理根目录为“我的应用程序文件夹”的应用程序“/LM/W3SVC/2/ROOT”已从 Program.Main 退出,退出代码为“0”。捕获的 stdout 和 stderr 日志的前 30KB 字符: 程序开始

物理根目录为“我的应用程序文件夹”的应用程序“/LM/W3SVC/2/ROOT”无法加载 coreclr。异常消息: CLR 工作线程提前退出

感谢您的宝贵时间

【问题讨论】:

这听起来像是在将 IIS Express 与 .net 核心平台“加入”的模块中发生了崩溃...假设您已经重新启动,而我们一直在做的所有事情... IIS “web.config”在 \.vs\Comma\config\applicationhost.config 请看看这个文件中是否正确注册了 AspNetCoreModuleV2 【参考方案1】:

好的,我想我找到了答案。它在我的情况下有效!

与此配置无关的程序 main.cs 的问题很有趣,它们表现得很好。 有几种情况会发生此错误

Case1- 从其他核心版本迁移到 .net core 3.1 时。将 kestrel 与 IHostBuilder 一起使用。不要用这个

            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                
                    webBuilder.ConfigureKestrel(serverOptions =>
                    
                        //..
                    )
                    .UseStartup<Startup>();
                )
            .Build();

改为使用这种风格。 (CreateHostBuilder)

            var host = CreateHostBuilder(args).UseServiceProviderFactory(new AutofacServiceProviderFactory()).Build();
            host.Run();

//..

public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>

    webBuilder.ConfigureKestrel(serverOptions =>
    
        serverOptions.Limits.MaxConcurrentConnections = 100;
        serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
        serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
        serverOptions.Limits.MinRequestBodyDataRate =
            new MinDataRate(bytesPerSecond: 100,
                gracePeriod: TimeSpan.FromSeconds(10));
        serverOptions.Limits.MinResponseDataRate =
            new MinDataRate(bytesPerSecond: 100,
                gracePeriod: TimeSpan.FromSeconds(10));
        serverOptions.Limits.KeepAliveTimeout =
            TimeSpan.FromMinutes(2);
        serverOptions.Limits.RequestHeadersTimeout =
            TimeSpan.FromMinutes(1);
    )
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseIISIntegration()
    .UseStartup<Startup>();
);

案例 2- Program.cs 找不到 Logger 文件或配置文件。可能无法达到文件夹文件权限等。请在 main 函数中使用 try catch 进行检查。

案例 3- InProcess 模式没有或配置错误的 AspNetCoreModuleV2

通常 1 是这个错误的正确情况,但对 2 和 3 感兴趣

【讨论】:

【参考方案2】:

以下步骤对我有用:

    确保应用程序池标识为托管代码 确保 IIS_IUSRS 有权访问网站文件夹 确保日志文件夹在发布时已在解决方案中创建。如果它不可用,我们还可以将 stdoutLogEnabled 设置为 true,正如 Alexander Protto 在另一个答案中所指出的那样。这一步是我的问题。 确保目标运行时正确。如果不正确,则错误会有所不同。 确保将 CreateDefaultBuilder(args) 添加到 startup.cs。这类似于 Hamit 发布的答案。

【讨论】:

【参考方案3】:

我遇到了同样的问题并尝试了所有方法。最终通过修复appsetting.json文件结构解决了问题。

我变了

stdoutLogEnabled="false" 

stdoutLogEnabled="true",

然后错误消息告诉我错误在哪里。

【讨论】:

【参考方案4】:

另外,请务必检查“appsetting.json”中的连接字符串。 在我的情况下,忘记向数据源添加转义字符。 所以,拥有服务器名称的正确方法是 \\MSSQLSERVER,但我有 \MSSQLSERVER。 只是一个小错误,但花了一些时间才弄清楚。

【讨论】:

【参考方案5】:

在寻找我的问题的解决方案时,我遇到了这篇文章。我基本上收到与您完全相同的错误,因为我还尝试使用 PhysicalFileProvider 从网络位置提供静态文件。在我的情况下,当我在 localhost 中调试时它运行良好......但在部署时我也得到了你的错误。我认为这条线是导致您的具体问题的原因:

       app.UseStaticFiles(new StaticFileOptions()
        
            FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"Library")),
            RequestPath = new PathString("/Library")
        );

我会尝试注释掉该块以查看错误是否仍然存在。

【讨论】:

【参考方案6】:

非常感谢。我遇到了同样的问题,我将 AspNetCoreHostingModel 键和值添加到我的 VS 项目中,它成功了。 我正在寻找我拿它的地方,但我找不到它,但它在 Stack Overflow 中。所以,感谢原始贡献者!!!

  <PropertyGroup>
      <TargetFramework>netcoreapp3.1</TargetFramework>
      <SignAssembly>false</SignAssembly>
      <OutputType>Exe</OutputType>
      <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
  </PropertyGroup>

【讨论】:

可能有:***.com/a/53814861/493984【参考方案7】:

正如其他用户所提到的,我已经尝试和工作的其中一件事是将托管模型更改为 OutOfProcess。但是,这并不总是有效,如果您配置了 swagger,我发现了一些相当奇怪的技巧,手动将“project”.xml 文件复制到解决方案的部署根目录。

但是应该通过检查您的事件查看器来备份后者,并且您有此错误 System.IO.FileNotFoundException

【讨论】:

【参考方案8】:

在我的情况下,将应用程序池帐户从 NetworkService 更改为 LocalSystem 解决了问题。

【讨论】:

以上是关于ASP.NET Core 3.1 - HTTP 错误 500.30 - ANCM 进程内启动失败的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 3.1 / 5 WeatherForecast 示例 Web API 项目引发错误 404

ASP.NET Core--.net core 3.1 部署到 IIS

Google OAuth 2.0 得到错误 400:redirect_uri_mismatch,ASP.net core 3.1

Angular 8 使用 ASP NET Core 3.1 Web Api 时出现 CORS 策略问题

从 ASP.NET Core 3.1 升级到 ASP.NET 5.0 后,User.Claims 为空

Wcf 服务在 .NET Core 3.1 控制台应用程序中工作,但在 ASP.NET Core 3.1 Web API 中无法工作