Поймать ошибки запуска Kestrel - PullRequest
0 голосов
/ 17 июня 2019

Я управляю сайтом, используя 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 code.

Я искал и нашел много примеров глобальной обработки исключений, которые, кажется, имеют дело с перенаправлением пользователя на страницу ошибки, и хотя я мог просто сделать это неправильно, у меня нет 'не удалось заставить работать ни один из этих примеров.

Сообщение об ошибке выглядит примерно так:

crit: Microsoft.AspNetCore.Server.Kestrel [0]

Невозможно запустить Kestrel.

Вместе с трассировкой стека.Я могу увидеть эту ошибку, запустив из командной строки, но мои пользователи не будут.Вот почему я действительно хочу быть в состоянии поймать это / записать это.

Может ли кто-нибудь помочь мне понять, что я делаю неправильно?

1 Ответ

1 голос
/ 18 июня 2019

Вам нужно установить .CaptureStartupErrors(false).Документация здесь .

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