我正在尝试托管我的API,但无法正常工作。一旦将数据库的初始化代码移至Program Main一处,便出现了问题。我将问题范围缩小到,只要执行host.Run(),对db上下文的任何使用都将导致应用程序无法托管。没有引发异常,但应用程序未正确托管(我无法访问api网址,并且该应用程序不会自动打开默认网址)。
最终我在使用db上下文中的任何方法之前弄清了是否执行host.Run(),该应用程序将正常工作。这不是最佳解决方案,我想知道问题出在哪里。上下文方法可以正确执行,并且我可以向数据库中添加内容,如果我在host.Run()之前使用上下文,则该应用程序将不会托管。
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<CashinContext>();
context.Database.EnsureCreated();
//DbInitializer.Initialize(context);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occured while seeding the database.");
}
}
host.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
更新 通过更改代码,
var context = services.GetRequiredService<CashinContext>();
收件人
var context = services.GetService<CashinContext>();
现在可以使用了。我不明白为什么,因为GetRequiredService()
应该在没有可用服务时引发异常,因此从来没有引发过异常。使用GetService()
时,如果没有可用的服务,该函数应返回null。我通过调试检查了此内容,但未返回null,一切都很好。