diff --git a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddlewareImpl.cs b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddlewareImpl.cs index 47320c6ecdd3..79602d59b034 100644 --- a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddlewareImpl.cs +++ b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddlewareImpl.cs @@ -148,7 +148,10 @@ public async Task Invoke(HttpContext context) context.Response.StatusCode = 500; } - await _exceptionHandler(new ErrorContext(context, ex)); + var errorContext = new ErrorContext(context, ex); + + SetExceptionHandlerFeatures(errorContext); + await _exceptionHandler(errorContext); const string eventName = "Microsoft.AspNetCore.Diagnostics.UnhandledException"; if (_diagnosticSource.IsEnabled(eventName)) @@ -200,17 +203,12 @@ private async Task DisplayExceptionContent(ErrorContext errorContext) { var httpContext = errorContext.HttpContext; - if (_problemDetailsService is not null) - { - SetExceptionHandlerFeatures(errorContext); - } - if (_problemDetailsService == null || !await _problemDetailsService.TryWriteAsync(new() - { - HttpContext = httpContext, - ProblemDetails = CreateProblemDetails(errorContext, httpContext), - Exception = errorContext.Exception - })) + { + HttpContext = httpContext, + ProblemDetails = CreateProblemDetails(errorContext, httpContext), + Exception = errorContext.Exception + })) { httpContext.Response.ContentType = "text/plain; charset=utf-8"; diff --git a/src/Middleware/Diagnostics/test/UnitTests/ExceptionHandlerMiddlewareTest.cs b/src/Middleware/Diagnostics/test/UnitTests/ExceptionHandlerMiddlewareTest.cs index 31c3fa12f5df..7b2f3760c197 100644 --- a/src/Middleware/Diagnostics/test/UnitTests/ExceptionHandlerMiddlewareTest.cs +++ b/src/Middleware/Diagnostics/test/UnitTests/ExceptionHandlerMiddlewareTest.cs @@ -315,6 +315,51 @@ public async Task Metrics_ExceptionThrown_Unhandled_Reported() m => AssertRequestException(m, "System.InvalidOperationException", "unhandled")); } + [Fact] + public async Task ExceptionFeatureSetOnDeveloperExceptionPage() + { + // Arrange + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + using var host = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseTestServer() + .Configure(app => + { + app.Use(async (context, next) => + { + await next(); + + var exceptionHandlerFeature = context.Features.GetRequiredFeature(); + tcs.SetResult(exceptionHandlerFeature); + }); + app.UseExceptionHandler(exceptionApp => + { + exceptionApp.Run(context => Task.CompletedTask); + }); + app.Run(context => + { + throw new Exception("Test exception"); + }); + + }); + }).Build(); + + await host.StartAsync(); + + var server = host.GetTestServer(); + var request = new HttpRequestMessage(HttpMethod.Get, "/path"); + + var response = await server.CreateClient().SendAsync(request); + + var feature = await tcs.Task; + Assert.NotNull(feature); + Assert.Equal("Test exception", feature.Error.Message); + Assert.Equal("/path", feature.Path); + } + private static void AssertRequestException(CollectedMeasurement measurement, string exceptionName, string result, string handler = null) { Assert.Equal(1, measurement.Value);