捕获红est启动错误

时间:2019-06-17 20:52:02

标签: c# asp.net-core .net-core kestrel-http-server

我正在使用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。

带有堆栈跟踪。通过从命令行运行,我可以看到此错误,但是我的用户不会。这就是为什么我真的希望能够捕获/记录它。

有人可以帮助我了解我在做什么错吗?

1 个答案:

答案 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>();
}