diff --git a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddlewareImpl.cs b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddlewareImpl.cs index 5d2589052eed..000fef3c278d 100644 --- a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddlewareImpl.cs +++ b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddlewareImpl.cs @@ -160,7 +160,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)) @@ -220,11 +223,6 @@ 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, diff --git a/src/Middleware/Diagnostics/test/UnitTests/ExceptionHandlerMiddlewareTest.cs b/src/Middleware/Diagnostics/test/UnitTests/ExceptionHandlerMiddlewareTest.cs index eaf419889b72..0fb82da9b733 100644 --- a/src/Middleware/Diagnostics/test/UnitTests/ExceptionHandlerMiddlewareTest.cs +++ b/src/Middleware/Diagnostics/test/UnitTests/ExceptionHandlerMiddlewareTest.cs @@ -547,6 +547,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); + } + [Fact] public async Task Metrics_ExceptionThrown_ErrorPathHandled_Reported() {