【问题标题】:Catching Kestrel Startup Errors捕获 Kestrel 启动错误
【发布时间】:2019-10-31 11:41:49
【问题描述】:

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

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

谁能帮我理解我做错了什么?

【问题讨论】:

  • 是否有任何演示可以重现您的问题?使用无效端口无法重现您的问题,catch (Exception e) 将被命中。
  • @TaoZhou - 感谢您的评论。你是对的,我无法通过演示重现这一点,我的代码中一定有什么地方做错了。我会继续看看我是否能弄清楚/提供一个样本
  • 谢谢大家。 @johnluke.laue 的回答似乎确实有效。我遇到的困难最终被追溯到一个在异常传播到我的处理程序之前显式调用 Environment.Exit(0) 的侦听器。

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


【解决方案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>();
}

【讨论】:

  • Run 将锁定直到关机,来自 RunAsync 的任务也不会在关机之前结束。有什么方法可以跟踪启动错误但仍然有一个任务作为关机的参考?只是在我调用 webTask = IWebHost.RunAsnyc(); 之后会出现一些超时任务延迟(1000); if(webTask.isFaulted) 抛出 webTask.Exception;否则返回 webTask
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2015-04-25
  • 2011-12-04
  • 2020-04-20
  • 1970-01-01
  • 2019-08-03
  • 2022-01-07
相关资源
最近更新 更多