【问题标题】:ASP.NET CORE 2.2 Deployment IssueASP.NET CORE 2.2 部署问题
【发布时间】:2019-06-19 00:55:58
【问题描述】:

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

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

检查事件日志后,我发现这是错误:

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.exedotnet api.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;
                }
            }
        }

DatabaseMigrator.cs

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
        }
    }

【问题讨论】:

  • 共享 program.cs 代码和 DatabaseMigrator 可能有助于解决问题。
  • "Digitise.ApiBase.BaseProgram.Initialise(String[] args, IWebHost host) 在 C:\Projects\Digitise.AspNetCore\Digitise.ApiBase\BaseProgram.cs:line 17" .. 是' t Program.cs 中定义和使用的 Initialize 函数??
  • @PraveenRai 我有一个基类,因为我们使用的是微服务基础架构,所以我只是在其中添加了它

标签: iis deployment asp.net-core-2.2


【解决方案1】:

我刚刚经历了很多痛苦来解决类似的问题。很确定问题出在您使用Directory.GetCurrentDirectory(),当在 IIS 中使用进程内托管运行时,这会发生奇怪的事情。我将其替换为Assembly.GetExecutingAssembly().Location,一切正常。

线索来自Dotnet Core Multiple Startup Classes with In-Process Hosting

【讨论】:

    【解决方案2】:

    在我更新一些 Nuget 包后,问题开始出现。安装最新的 .NET Core SDK 有帮助。

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 2019-10-30
      • 2020-04-22
      • 2019-07-17
      • 2019-05-11
      • 1970-01-01
      • 2016-12-25
      • 2019-11-05
      • 1970-01-01
      相关资源
      最近更新 更多