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

时间:2020-05-08 12:04:06

标签: c# asp.net-core asp.net-core-webapi

我正在使用3.1版本配置Net Core Web API。我已经在这里检查了这个问题,但没有一个答案适合我的情况。

我尝试使用Net Core Ver 3.1配置Web API。另一个具有简单配置和相同版本软件包的应用程序也可以在我的PC上使用相同的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工作线程过早退出

感谢您的时间

7 个答案:

答案 0 :(得分:2)

好的,我想我找到了答案。就我而言,它奏效了!

程序main.cs的问题很有趣,但没有这种配置,它们显示的很好。 发生这种情况有几种情况

Case1-从其他核心版本迁移到.net核心3.1时。在IHostBuilder中使用 kestrel 。请勿使用

            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文件或配置文件。可能无法达到文件夹文件的权限等。请在主要功能中使用try catch进行检查。

情况3-在InProcess模式下没有或配置错误的AspNetCoreModuleV2

通常1是解决此错误的正确方法,但对2和3感兴趣

答案 1 :(得分:1)

以下步骤对我有用:

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我遇到了同样的问题,并尝试了一切。最后,通过修复appsetting.json文件结构解决了该问题。

我改变了

stdoutLogEnabled="false" 

stdoutLogEnabled="true",

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

就我而言,将应用程序池帐户从 NetworkService 更改为 LocalSystem 解决了问题。