我正在使用Kestrel运行网站。我有一个IWebHost
,并在其上调用.Run()。
var app = host.Build();
app.Run();
通常,这很好,但是我有一个我要关注的特定情况。有时正在使用指定的端口。我知道我可以检查配置/设置过程中是否正在使用端口,但是在我检查之后但在Kestrel监听之前,总有可能有人会使用该端口。而且,我确定还有其他问题可能导致app.Run()行失败。
app.Run()
失败时,我想记录一条错误消息以记录文件。问题在于该应用程序似乎崩溃了,我无法处理该异常。
例如,我尝试过:
var app = host.Build();
try
{
app.Run();
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
但是它根本不会触及catch
代码。
我已经搜索并找到了许多有关全局异常处理的示例,这些示例似乎与将用户重定向到错误页面有关,尽管我可能只是做错了,但我还是无法获得任何这些例子起作用。
错误消息与此类似:
暴击:Microsoft.AspNetCore.Server.Kestrel [0]
无法启动Kestrel。
带有堆栈跟踪。通过从命令行运行,我可以看到此错误,但是我的用户不会。这就是为什么我真的希望能够捕获/记录它。
有人可以帮助我了解我在做什么错吗?
答案 0 :(得分:1)
您需要设置.CaptureStartupErrors(false)
。文档here。
public class Program
{
public static void Main(string[] args)
{
try
{
CreateWebHostBuilder(args).Build().Run();
}
catch(Exception ex)
{
Log.Fatal(ex, "App crashed");
}
finally
{
Log.CloseAndFlush();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.CaptureStartupErrors(false) //allow startup errors to propagate
.UseStartup<Startup>();
}