ASP .NET Core IIS 部署 IIS AspNetCore 模块错误:CLR 工作线程过早退出

Posted

技术标签:

【中文标题】ASP .NET Core IIS 部署 IIS AspNetCore 模块错误:CLR 工作线程过早退出【英文标题】:ASP .NET Core IIS Deploy IIS AspNetCore Module Error: CLR worker thread exited prematurely 【发布时间】:2021-07-22 13:29:30 【问题描述】:

我为 IIS 提供了 Windows 中的所有功能,但如果您有任何建议,请与我分享。无论如何,我想部署在 IIS 局域网服务器上。但我不能。我工作了两天这个问题。我不知道如何解决这个问题。我使用“.net.5.0”。 我的应用程序代码是这样的

Program.cs

public class Program

    public static void Main(string[] args)
    
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration().UseUrls("http://localhost:8080/")
            .UseStartup<Startup>()
            .Build();
      

启动

namespace EcommerceGastro.API

    public class Startup
    
        public Startup(IConfiguration configuration)
        
            Configuration = configuration;
        

        public IConfiguration Configuration  get; 

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        

            services.AddDbContext<GastroDB>();
            services.AddScoped<IMainCategoryService, MainCategoryService>();
            services.AddScoped<IProductService, ProductService>();
            services.AddScoped<ICategoryService, CategoryService>();
            services.AddScoped<IUploadImageService, UploadImageService>();
            services.AddAutoMapper(typeof(AutoMapperProfile));
            services.AddControllers();
            services.AddControllers().AddNewtonsoftJson(opt =>
            
                opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
            );
        

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            

            app.UseRouting();
            app.UseStaticFiles();
            //Initiliazer.HomePageControl().Wait();
            app.UseAuthorization();

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


appsettings.json


  "Logging": 
    "LogLevel": 
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    
  ,
  "AllowedHosts": "*",
  "ConnectionStrings":  "DefaultConnection": "server=.; database=GastroDB; user id=sa; password=123;" 



我的发布设置:

我的 iis 设置:

Paylaşılmıyor = 不要分享

Yetkilendirme = 权威

我的错误:

Application '/LM/W3SVC/1/ROOT' with physical root 'C:\Users\Tuğçe\Desktop\iisDeneme\EcommerceGastro.API\bin\Release\net5.0\publish\' failed to load coreclr. Exception message:
CLR worker thread exited prematurely
Application '/LM/W3SVC/1/ROOT' with physical root 'C:\Users\Tuğçe\Desktop\iisDeneme\EcommerceGastro.API\bin\Release\net5.0\publish\' has exited from Program.Main with exit code = '0'. Please check the stderr logs for more information.

我浏览了这个 iis 网络应用程序,它打开但看起来像:

HTTP Error 500.30 - ASP.NET Core app failed to start
Common solutions to this issue:
The app failed to start
The app started but then stopped
The app started but threw an exception during startup
Troubleshooting steps:
Check the system event log for error messages
Enable logging the application process' stdout messages
Attach a debugger to the application process and inspect
For more information visit: https://go.microsoft.com/fwlink/?LinkID=2028265

【问题讨论】:

我认为问题可能在于访问数据库。这在此类错误消息中很常见。 您是否按照错误信息中的说明进行操作?它在那里说:“检查系统事件日志中的错误消息” 【参考方案1】:

解决此错误的最常见和最简单的方法是重新发布您的代码,但要启用“在目标位置删除其他文件”选项。这将确保 Visual Studio 的 Web 部署过程将在复制新代码文件之前从 Web 应用程序中删除所有现有文件。这将导致发布完成后,Web App 文件系统中将仅存在所发布的必要文件。它还确保所有文件都被最新版本覆盖;以防万一也有干扰。

要启用“在目标位置删除其他文件”设置,请在 Visual Studio 中的“发布配置文件”上单击“编辑”。该设置位于“文件发布选项”可展开区域下方的“设置”选项卡上。选中该框以启用该功能,然后单击“保存”。

【讨论】:

【参考方案2】:

如果您处于调试模式(Visual Studio),只需清理解决方案即可解决问题。 在生产模式(IIS)下,首先清理解决方案,发布项目,并替换为上一个。 (确保您将删除之前提到的@Samwu 中的整个以前的文件夹和设置)

【讨论】:

【参考方案3】:

在我的例子中,问题在于它在 32 位应用程序池上运行,但应用程序发布为 Framework-Dependent,目标运行时为 win-x64。当我将它切换到win-x86 时,我的应用程序开始工作,所以我查看了它并发现了应用程序池的问题。我创建了一个新的应用程序池,禁用了 32 位,将我的应用程序切换到该池,然后重新发布,然后它就可以工作了。

编辑添加:由于不同的原因,我有第二个应用程序显示相同的行为。在第二种情况下,这是因为我使用 Serilog 将日志文件写入应用程序的根目录。但是因为应用程序池没有对该目录的写权限,所以它失败并抛出了500.30 错误。授予应用程序池对其目录的写入权限解决了该问题。

【讨论】:

【参考方案4】:

就我而言,只需使用以下代码更新我的代码:

 public static void Main(string[] args)
        
            CreateHostBuilder(args).Build().Run();
        

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

---更新说明---

Main 方法没有函数:CreateHostBuilder(args).Build().Run(); 出于这个原因,我的 Web 应用程序发送了错误:HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动。 请考虑以下参考: Asp .Net Core Main Method!

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于ASP .NET Core IIS 部署 IIS AspNetCore 模块错误:CLR 工作线程过早退出的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core部署系列一:发布到IIS上

如何将针对 net452 项目的 ASP.NET Core 部署为 IIS 中网站的 IIS 应用程序

Windows + IIS 环境部署Asp.Net Core App

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

[Asp.Net Core]IIS部署

ASP.NET Core 在 IIS 下的两种部署模式