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 已被填充。
谢谢大家
我想控制我的 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 已被填充。
谢谢大家