Сбой сервера Kestrel в случае исключения - PullRequest
0 голосов
/ 27 марта 2020

Я использую серверное приложение на базе Kestrel с ASP. net core 2.1. У меня есть специальное промежуточное программное обеспечение для обработки ошибок, например:

public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate next;

    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context /* other dependencies */)
    {
        try
        {
            await next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        Log.Warning(exception,"Exception occurred: {exception}",exception);

        var code = HttpStatusCode.InternalServerError; // 500 if unexpected

        var result = JsonConvert.SerializeObject(new { error = exception.Message });
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)code;

        return context.Response.WriteAsync(result);
    }
}

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

Могут ли быть какие-либо известные ошибки, которые я мог бы сделать, чтобы сервер остановился? Что-нибудь, что я мог бы включить для диагностики?

Трассировки стека зарегистрированных исключений обычно указывают на некоторую проблему с вводом или вещами, о которых я хотел бы сообщить, используя ErrorHandlingMiddleware.

1 Ответ

0 голосов
/ 05 мая 2020

Вы используете Windows или Liunx? Если вы используете Windows, вы сможете записать дамп cra sh на процесс cra sh, используя WER (Windows Отчет об ошибках) https://michaelscodingspot.com/how-to-create-use-and-debug-net-application-crash-dumps-in-2019/#Automatically -create-dump-on-Cra sh.

На Linux вы можете сделать это https://www.cyberciti.biz/tips/linux-core-dumps.html

Это позволит вам собрать дамп cra sh и проанализировать его, чтобы увидеть откуда исходит sh.

Как правило, мы отлавливаем все исключения, возникающие во время запросов. Сбой процесса обычно означает:

  • Исключение, выброшенное из:
    • асинхронный c пустой метод в вашем коде
    • Фоновая нить
  • Исключение переполнения стека
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...