c#异常在中间件中丢失innerException

c# Exception lost innerException in middleware

我想控制我的 Web 应用程序中发生的所有异常的详细信息。我想将自定义数据添加到异常中。如果处于调试模式,我还想添加更多信息。我确实想将其作为 JSON 格式传递给用户。

为此,我想抛出一个带有自定义错误代码的异常,并传递 innerexception 以进行调试。

在我的 startup.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseMiddleware(typeof(ErrorHandlingMiddleware)); // Error handling middlware
            ....

在我的服务中抛出异常:

catch (Exception e)
{
    throw new Exception("E18", e.InnerException);
}

当我调试这个的时候。我可以看到 e.InnerException 填满了数据。

魔法来了……好吧……有点像。这是中间件:

public class ErrorHandlingMiddleware
{
    static Dictionary<string, APIMessageDetails> responseMessageCodes = new Dictionary<string, APIMessageDetails>
    {
            ...
            {"E18", new APIMessageDetails {responseMessage = "An unknown error occured.", httpStatusCode = StatusCodes.Status500InternalServerError}},
            ...
    }

    private readonly RequestDelegate next;

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

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

    private static Task HandleExceptionAsync(HttpContext context, Exception ex)
    {
        string errorCode = ex.Message;
        APIMessageDetails result;
        APIMessage apiMessage = new APIMessage();

        if (errorCode != null)
        {
            if (responseMessageCodes.TryGetValue(errorCode, out result))
            {
                apiMessage.responseMessageCode = errorCode;
                apiMessage.messageDetails = result;
#if DEBUG
                apiMessage.messageDetails.exception = ex;
#endif
            }
        }
        var jsonResult = JsonConvert.SerializeObject(apiMessage);
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = apiMessage.messageDetails.httpStatusCode;
        return context.Response.WriteAsync(jsonResult);
    }
}

调试的时候发现中间件捕获的异常确实包含E18,但是innerException为null。我不明白为什么会这样;它被传递给抛出的异常...

我希望有人能帮助我。

糟糕...似乎上面的代码一切正常。似乎有一些中间件导致双重请求...

必须解决这个问题,但通过禁用中间件,innerException 已被填充。

谢谢大家