Iis ASP.NET核心2.2部署问题

Iis ASP.NET核心2.2部署问题,iis,deployment,asp.net-core-2.2,Iis,Deployment,Asp.net Core 2.2,我遇到了最奇怪的问题,我不知道为什么。 将.net core 2.2 api部署到本地IIS服务器时,我收到以下错误消息: HTTP错误502.5-ANCM进程外启动失败 检查事件日志I后,我发现以下错误: Application: dotnet.exe CoreCLR Version: 4.6.27207.3 Description: The process was terminated due to an unhandled exception. Exception Info: System

我遇到了最奇怪的问题,我不知道为什么。 将.net core 2.2 api部署到本地IIS服务器时,我收到以下错误消息:

HTTP错误502.5-ANCM进程外启动失败

检查事件日志I后,我发现以下错误:

Application: dotnet.exe
CoreCLR Version: 4.6.27207.3
Description: The process was terminated due to an unhandled exception.
Exception Info: System.InvalidOperationException: No service for type 'Digitise.Infrastructure.Services.DatabaseMigrator' has been registered.
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
   at Digitise.ApiBase.BaseProgram.Initialise(String[] args, IWebHost host) in C:\Projects\Digitise.AspNetCore\Digitise.ApiBase\BaseProgram.cs:line 17
   at Digitise.Api.Program.Main(String[] args) in C:\Projects\Digitise.AspNetCore\Digitise.Api\Program.cs:line 27
似乎DI工作不正常!奇怪的是,如果我运行
api.exe
dotnetapi.dll
api工作得很好:/

有人有什么想法吗?:)

Program.cs

public class Program    
    {
            public static object _lock = new object();
            public static bool _init = false;

            public static void Main(string[] args)
            {
                var host = CreateWebHostBuilder(args);
                Initialise(args, host);
            }

            public static IWebHost CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    //.UseIISIntegration()
                    .UseIIS()
                    .UseNLog()
                    .UseShutdownTimeout(TimeSpan.FromSeconds(10))
                    .Build();

            public static void Initialise(string[] args, IWebHost host)
            {
                var logger = NLogBuilder.ConfigureNLog(Path.Combine(Directory.GetCurrentDirectory(), "NLog.config")).GetCurrentClassLogger();
                try
                {
                    logger.Debug("App init");

                    using (var scope = host.Services.CreateScope())
                    {
                        var services = scope.ServiceProvider;
                        try
                        {
                            if (!_init)
                            {
                                lock (_lock)
                                {
                                    if (!_init)
                                    {
                                        lock (_lock)
                                        {
                                            services.GetRequiredService<DatabaseMigrator>().Migrate();
                                        }
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            logger.Error(ex, "An error occurred while starting up the app.");
                            throw;
                        }
                    }

                    host.Run();
                }
                catch (Exception e)
                {
                    logger.Error(e, "Stopped app due to exception");
                    throw;
                }
            }
        }
public class DatabaseMigrator
    {
        private readonly TenantDbContext _tenantDbContext;
        private readonly IOptions<DatabaseConfiguration> _databaseConfig;
        private readonly ILogger<DatabaseMigrator> _logger;
        private readonly AdminTenantDbInitialiser _adminTenantDbInitialiser;

        public DatabaseMigrator(TenantDbContext tenantDbContext, IOptions<DatabaseConfiguration> databaseConfig, ILogger<DatabaseMigrator> logger, AdminTenantDbInitialiser adminTenantDbInitialiser)
        {
            _tenantDbContext = tenantDbContext;
            _databaseConfig = databaseConfig;
            _logger = logger;
            _adminTenantDbInitialiser = adminTenantDbInitialiser;
        }

        public void Migrate()
        {
           //migration logic
        }
    }
公共类程序
{
公共静态对象_lock=新对象();
公共静态bool_init=false;
公共静态void Main(字符串[]args)
{
var host=CreateWebHostBuilder(args);
初始化(args,主机);
}
公共静态IWebHost CreateWebHostBuilder(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseStartup()
//.Useii整合()
.UseIIS()
.UseNLog()
.UseShutdownTimeout(时间跨度从秒(10))
.Build();
公共静态void初始化(字符串[]args,IWebHost主机)
{
var logger=NLogBuilder.ConfigureNLog(Path.Combine(Directory.GetCurrentDirectory(),“NLog.config”)).GetCurrentClassLogger();
尝试
{
logger.Debug(“App init”);
使用(var scope=host.Services.CreateScope())
{
var services=scope.ServiceProvider;
尝试
{
如果(!\u init)
{
锁
{
如果(!\u init)
{
锁
{
services.GetRequiredService().Migrate();
}
}
}
}
}
捕获(例外情况除外)
{
logger.Error(例如,“启动应用程序时出错”);
投掷;
}
}
host.Run();
}
捕获(例外e)
{
logger.错误(e,“由于异常而停止应用”);
投掷;
}
}
}
DatabaseMigrator.cs

public class Program    
    {
            public static object _lock = new object();
            public static bool _init = false;

            public static void Main(string[] args)
            {
                var host = CreateWebHostBuilder(args);
                Initialise(args, host);
            }

            public static IWebHost CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    //.UseIISIntegration()
                    .UseIIS()
                    .UseNLog()
                    .UseShutdownTimeout(TimeSpan.FromSeconds(10))
                    .Build();

            public static void Initialise(string[] args, IWebHost host)
            {
                var logger = NLogBuilder.ConfigureNLog(Path.Combine(Directory.GetCurrentDirectory(), "NLog.config")).GetCurrentClassLogger();
                try
                {
                    logger.Debug("App init");

                    using (var scope = host.Services.CreateScope())
                    {
                        var services = scope.ServiceProvider;
                        try
                        {
                            if (!_init)
                            {
                                lock (_lock)
                                {
                                    if (!_init)
                                    {
                                        lock (_lock)
                                        {
                                            services.GetRequiredService<DatabaseMigrator>().Migrate();
                                        }
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            logger.Error(ex, "An error occurred while starting up the app.");
                            throw;
                        }
                    }

                    host.Run();
                }
                catch (Exception e)
                {
                    logger.Error(e, "Stopped app due to exception");
                    throw;
                }
            }
        }
public class DatabaseMigrator
    {
        private readonly TenantDbContext _tenantDbContext;
        private readonly IOptions<DatabaseConfiguration> _databaseConfig;
        private readonly ILogger<DatabaseMigrator> _logger;
        private readonly AdminTenantDbInitialiser _adminTenantDbInitialiser;

        public DatabaseMigrator(TenantDbContext tenantDbContext, IOptions<DatabaseConfiguration> databaseConfig, ILogger<DatabaseMigrator> logger, AdminTenantDbInitialiser adminTenantDbInitialiser)
        {
            _tenantDbContext = tenantDbContext;
            _databaseConfig = databaseConfig;
            _logger = logger;
            _adminTenantDbInitialiser = adminTenantDbInitialiser;
        }

        public void Migrate()
        {
           //migration logic
        }
    }
公共类数据库迁移器
{
私有只读租户上下文\u租户上下文;
专用只读IOptions\u databaseConfig;
专用只读ILogger\u记录器;
私有只读AdmintenantBinInitialiser\u AdmintenantBinInitialiser;
公共数据库迁移器(TenantDbContext TenantDbContext、IOptions databaseConfig、ILogger记录器、AdminTenantDbInitialiser AdminTenantDbInitialiser)
{
_tenantDbContext=tenantDbContext;
_databaseConfig=databaseConfig;
_记录器=记录器;
_AdmintenantBinInitialiser=AdmintenantBinInitialiser;
}
公共空间迁移()
{
//迁移逻辑
}
}

我刚刚经历了很多痛苦来修复一个类似的问题。可以肯定的是,问题在于您使用的是
目录。GetCurrentDirectory()
,在IIS中运行进程内托管时,这会产生一些奇怪的情况。我将其替换为
Assembly.getExecutionGassembly().Location
,所有操作都正常


线索来自于

在我的案例中,在我更新了一些Nuget软件包之后,问题开始出现。安装最新的.NET Core SDK有所帮助

共享program.cs代码和DatabaseMigrator可能有助于发现问题。“C:\Projects\Digitise.AspNetCore\Digitise.ApiBase\BaseProgram.cs中的Digitise.ApiBase.BaseProgram.Initialise(字符串[]args,IWebHost主机)”第17行“。。初始化函数不是在Program.cs中定义和使用的吗???@PraveenRai我有一个基类,因为我们使用的是微服务基础设施,所以我只是在那里添加了它