diff --git a/src/Presentation/Nop.Web.Framework/Infrastructure/Extensions/ApplicationBuilderExtensions.cs b/src/Presentation/Nop.Web.Framework/Infrastructure/Extensions/ApplicationBuilderExtensions.cs index 0f2fd21dd76..d31fb7b1765 100644 --- a/src/Presentation/Nop.Web.Framework/Infrastructure/Extensions/ApplicationBuilderExtensions.cs +++ b/src/Presentation/Nop.Web.Framework/Infrastructure/Extensions/ApplicationBuilderExtensions.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Diagnostics; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.HttpOverrides; using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.StaticFiles; @@ -167,8 +168,8 @@ await logger.ErrorAsync($"Error 404. The requested page ({originalPath}) was not { //get new path var pageNotFoundPath = "/page-not-found"; - //re-execute request with new path - context.HttpContext.Response.Redirect(context.HttpContext.Request.PathBase + pageNotFoundPath); + + await CreateHandler(pageNotFoundPath, null)(context); } finally { @@ -538,5 +539,56 @@ public static void UseNopWebMarkupMin(this IApplicationBuilder application) application.UseWebMarkupMin(); } + + private static Func CreateHandler( + string pathFormat, + string queryFormat, + RequestDelegate next = null) + { + return (async context => + { + var statusCode = context.HttpContext.Response.StatusCode; + var pathString = new PathString(string.Format(CultureInfo.InvariantCulture, pathFormat, statusCode)); + var str = queryFormat == null ? null : string.Format(CultureInfo.InvariantCulture, queryFormat, statusCode); + var queryString = queryFormat == null ? QueryString.Empty : new QueryString(str); + var originalPath = context.HttpContext.Request.Path; + var originalQueryString = context.HttpContext.Request.QueryString; + var routeValuesFeature = context.HttpContext.Features.Get(); + context.HttpContext.Features.Set(new StatusCodeReExecuteFeature + { + OriginalPathBase = context.HttpContext.Request.PathBase.Value!, + OriginalPath = originalPath.Value!, + OriginalQueryString = (originalQueryString.HasValue ? originalQueryString.Value : null), + Endpoint = context.HttpContext.GetEndpoint(), + RouteValues = routeValuesFeature?.RouteValues + }); + context.HttpContext.SetEndpoint(null); + if (routeValuesFeature != null) + routeValuesFeature.RouteValues = null!; + context.HttpContext.Request.Path = pathString; + context.HttpContext.Request.QueryString = queryString; + try + { + if (next != null) + { + await next(context.HttpContext); + originalPath = new PathString(); + originalQueryString = new QueryString(); + } + else + { + await context.Next(context.HttpContext); + originalPath = new PathString(); + originalQueryString = new QueryString(); + } + } + finally + { + context.HttpContext.Request.QueryString = originalQueryString; + context.HttpContext.Request.Path = originalPath; + context.HttpContext.Features.Set(null); + } + }); + } } }