【问题标题】:Kestrel server crashes on exceptionKestrel 服务器因异常而崩溃
【发布时间】:2020-03-27 12:44:45
【问题描述】:

我正在使用带有 ASP.net core 2.1 的基于 Kestrel 的服务器应用程序。我有一个这样的自定义错误处理中间件:

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 报告的事情。

【问题讨论】:

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


    【解决方案1】:

    您使用的是 Windows 还是 Liunx?如果使用 Windows,您应该能够使用 WER(Windows 错误报告)https://michaelscodingspot.com/how-to-create-use-and-debug-net-application-crash-dumps-in-2019/#Automatically-create-dump-on-Crash 捕获进程崩溃时的崩溃转储。

    在 Linux 上你可以这样做https://www.cyberciti.biz/tips/linux-core-dumps.html

    这应该可以让您收集崩溃转储,您可以对其进行分析以查看崩溃的来源。

    通常我们会捕获请求期间发生的所有异常。进程崩溃通常意味着:

    • 抛出异常:
      • 代码中的异步 void 方法
      • 后台线程
    • stackoverflow 异常

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 2011-02-22
      • 2019-03-26
      • 1970-01-01
      • 2014-04-10
      • 2013-12-20
      • 2013-10-08
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多